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)二分进行查询 这里直接循环的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 **************************************/