%%%城市交通费 city //程序超时

//写在前面:很久没水博客了,犹记当年豪哥硬逼着我申请了博客,现在豪哥退役了,我依然在为国一而奋斗。

//附: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 }
原文地址:https://www.cnblogs.com/nengshen/p/6910253.html