sdut1282Find the Path (floyd变形)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1282

感觉这题就比较有意思了 ,虽说是看了别人的代码,我依旧卡了好几天,原因1.我理解错题意了 原因2.网上题解没有一个把这题说明白的,也没有解释题意的。。。

每条路径上的警察的最大值不超过K 而不是总和不超过K

容易想到用二维spfa来更新 不过k太大了 

可以想一下floyd的原本思想 是dp[i][j]  = dp[i][j]+dp[j][k],经过j做中转之后的最短路 也就是每两个结点  都会有N次更新 

这里把更新顺序做了一下改变 以c从小到大排序 然后依次更新 也就是dp[i][j][k] 的含义为c值不超过c[i]的最短路径 这样询问的时候可以o(log2n)二分进行查询 这里直接循环的

 

  1 #include <iostream>

  2 #include<cstdio>

  3 #include<algorithm>

  4 #include<stdlib.h>

  5 #include<cstring>

  6 #include<vector>

  7 #include<queue>

  8 using namespace std;

  9 #define INF 1e10

 10 #define N 210

 11 #define LL long long

 12 LL dp[N][N][N];

 13 struct node

 14 {

 15     LL c;

 16     int id;

 17 }p[N];

 18 int ip[N];

 19 bool cmp(node x,node y)

 20 {

 21     return x.c<y.c;

 22 }

 23 bool comp(int x,int y)

 24 {

 25     return p[x].c<p[y].c;

 26 }

 27 int main()

 28 {

 29     int t,i,j,n,m,u,v,w,q,k;

 30     LL c;

 31     cin>>t;

 32     while(t--)

 33     {

 34         cin>>n>>m;

 35         for(i = 0; i <= n ; i++)

 36             for(j = 0; j <= n ;j++)

 37                 for(k = 0; k <= n ;k++)

 38                 dp[i][j][k] = INF;

 39         p[0].id = 0;

 40         for(i = 1; i <= n ;i++)

 41         {

 42             cin>>p[i].c;

 43             ip[i] = i;

 44             p[i].id = i;

 45             dp[0][i][i] = 0;

 46         }

 47         sort(p+1,p+n+1,cmp);

 48         for(i = 1; i <= m ;i++)

 49         {

 50             cin>>u>>v>>w;

 51             dp[0][u+1][v+1] = w;

 52             dp[0][v+1][u+1] = w;

 53         }

 54         for(i = 1; i <= n ;i++)

 55         {

 56             //v = ip[i];

 57             v = p[i].id;

 58             for(j = 1; j <= n ;j++)

 59                 for(k = 1 ;k <= n ;k++)

 60                 {

 61                     dp[i][j][k] = dp[i-1][j][k];

 62                     dp[i][j][k] = min(dp[i-1][j][v]+dp[i-1][v][k],dp[i][j][k]);

 63                 }

 64         }

 65         cin>>q;

 66 

 67         while(q--)

 68         {

 69             cin>>u>>v>>c; u++,v++;

 70             for(i = n; i >= 1 ;i--)

 71             if(p[i].c<=c) break;

 72             if(dp[i][u][v]==INF)

 73             puts("-1");

 74             else

 75             cout<<dp[i][u][v]<<endl;

 76         }

 77         puts("");

 78     }

 79     return 0;

 80 }

 81 

 82 

 83 

 84 

 85 /**************************************

 86     Problem id    : SDUT OJ 1282

 87     User name    : shang

 88     Result        : Wrong Answer

 89     Take Memory    : 64256K

 90     Take Time    : 230MS

 91     Submit Time    : 2014-02-19 21:37:46

 92 **************************************/

 93  

 94 

 95 

 96 

 97 /**************************************

 98     Problem id    : SDUT OJ 1282 

 99     User name    : shang 

100     Result        : Accepted 

101     Take Memory    : 64252K 

102     Take Time    : 270MS 

103     Submit Time    : 2014-02-19 22:38:44  

104 **************************************/
View Code

 

你可能感兴趣的:(floyd)