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

 

posted @ 2014-02-20 10:18  _雨  阅读(222)  评论(0编辑  收藏  举报