//写在前面:很久没水博客了,犹记当年豪哥硬逼着我申请了博客,现在豪哥退役了,我依然在为国一而奋斗。
//附:http://www.cnblogs.com/candy99/p/6875841.html 豪哥退役宣言
//感谢赵老师配图
2017 青岛比赛 第二题
一道貌似眼熟的最短路
用Floyd的思想,加一点改造
通过枚举城市繁华度,将大于当前值的城市忽略,将剩余城市跑一遍最短路
最后取最优值
复杂度o(n^4)
小数据可以,最起码先水掉了样例
还可以进行一些简化
发现p是多余的,先不改了
应该用Dijkstra复杂度%%%% 只是Floyd比较好打……
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int dis[255][255][255]; 6 int mi[255][255]; 7 int a,b,c; 8 int n,m,q; 9 int x; 10 int pp[255]; 11 struct node{ 12 int p; 13 int xu; 14 }p[255]; 15 int com(const node a,const node b){ 16 return a.p >b.p ; 17 } 18 int main(){ 19 scanf("%d%d%d",&n,&m,&q); 20 for(int i=1;i<=n;i++){ 21 scanf("%d",&pp[i]); 22 p[i].p =pp[i]; 23 p[i].xu =i; 24 } 25 for(int i=1;i<=n;i++){ 26 for(int j=i;j<=n;j++){ 27 mi[i][j]=mi[j][i]=9999999; 28 for(int k=1;k<=n;k++){ 29 dis[i][j][k]=dis[j][i][k]=9999999;} 30 } 31 } 32 33 for(int i=1;i<=m;i++){ 34 scanf("%d%d%d",&a,&b,&c); 35 for(int j=1;j<=n;j++){ 36 dis[a][b][j]=dis[b][a][j]=c;} 37 } 38 sort(p+1,p+n+1,com); 39 for(int l=1;l<=n;l++){ 40 if(p[l].p ==p[l+1].p )continue; 41 x=p[l].p ; 42 for(int k=1;k<=n;k++){ 43 if(pp[k]>x)continue; 44 45 for(int i=1;i<=n;i++){ 46 if(pp[i]>x)continue; 47 for(int j=1;j<=n;j++){ 48 if(pp[j]>x)continue; 49 if(dis[i][j][l]>dis[i][k][l]+dis[k][j][l]){ 50 dis[i][j][l]=dis[i][k][l]+dis[k][j][l]; 51 } 52 } 53 } 54 } 55 for(int i=1;i<=n;i++){ 56 for(int j=1;j<=n;j++){ 57 if(pp[i]<=x&&pp[j]<=x&&mi[i][j]>dis[i][j][l]+x){ 58 mi[i][j]=dis[i][j][l]+x; 59 } 60 } 61 } 62 } 63 /* for(int i=1;i<=n;i++){ 64 for(int j=1;j<=n;j++) 65 cout<<mi[i][j]<<" "; 66 cout<<endl; 67 }*/ 68 for(int i=1;i<=q;i++){ 69 scanf("%d%d",&a,&b); 70 printf("%d ",mi[a][b]); 71 } 72 }