题目看懂了,然而没注意看数组,肿么辣么大~~天真的用了flody,超超超,,,
就是有n个车站,m条路线,每条路线有一个价格。
要求从起始站到每一站,然后再从每一站回去,求最少的钱数。
看起来就是最短路径的问题,就是求单源点到其他各点的最但距离(票价),然后建个反向图,求的返回的钱数。也就是1到个点的价格加上各点返回1的价格。
最短路径很多方法,Dijkstra算法,Bell-ford算法,floyd-washall,以及本题目用的spfa算法。
由于数据比较大,Dijkstra算法 (o(n^2)) floyd-washall(o(n^3))肯定会超时。
其实spfa比Dijkstra算法还要简单,代码更少,就是维护一个队列,队列里面放着可能经过的点,知道队列为空。
~~~然而目前我还不是太会用
注意要用邻接表保存图,邻接矩阵会超内存的。
天真代码:超超超~~~
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<queue> 5 #include<algorithm> 6 #include<time.h> 7 using namespace std; 8 9 #define N 1550000 10 #define INF 0x3f3f3f3f 11 12 int P,maps[2500][2500]; 13 14 void Init() 15 { 16 for(int i=1;i<=P;i++) 17 for(int j=1;j<=P;j++) 18 maps[i][j]=(i==j)?0:INF; 19 } 20 21 void flody() 22 { 23 for(int k=1;k<=P;k++) 24 for(int i=1;i<=P;i++) 25 for(int j=1;j<=P;j++) 26 maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]); 27 } 28 29 int main() 30 { 31 int T,Q,i,a,b,price; 32 scanf("%d", &T); 33 34 while(T--) 35 { 36 scanf("%d %d", &P,&Q); 37 Init(); 38 39 for(i=1;i<=Q;i++) 40 { 41 scanf("%d %d %d", &a,&b,&price); 42 maps[a][b]=price; 43 } 44 45 flody(); 46 47 int sum=0; 48 for(i=1;i<=P;i++) 49 sum+=maps[1][i]+maps[i][1]; 50 51 printf("%d ", sum); 52 } 53 return 0; 54 }
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<queue> 5 #include<algorithm> 6 #include<time.h> 7 using namespace std; 8 9 #define N 1550000 10 #define INF 0x3f3f3f3f 11 12 long long dist[N]; 13 int vis[N],head[N]; 14 int k; 15 16 struct node 17 { 18 int u,v,nb; 19 long long price; 20 }edge[N]; 21 22 struct point 23 { 24 int a,b; 25 long long price; 26 }d[N]; 27 28 void Add(int a,int b,long long price,int k) 29 { 30 edge[k].u=a; 31 edge[k].v=b; 32 edge[k].price=price; 33 edge[k].nb=head[a]; 34 head[a]=k; 35 } 36 37 long long spfa(int n) 38 { 39 queue<int>Q; 40 Q.push(1); 41 vis[1]=1; 42 43 for(int i=1;i<=n;i++) 44 dist[i]=INF; 45 dist[1]=0; 46 47 while(Q.size()) 48 { 49 int x=Q.front(); 50 Q.pop(); 51 vis[x]=0; 52 53 for(int j=head[x];j;j=edge[j].nb) 54 { 55 int u=edge[j].u; 56 int v=edge[j].v; 57 long long price=edge[j].price; 58 59 if(dist[u]+price<dist[v]) 60 { 61 dist[v]=dist[u]+price; 62 if(vis[v]==0) 63 { 64 Q.push(v); 65 vis[v]=1; 66 } 67 } 68 } 69 } 70 long long sum=0; 71 72 for(int i=1;i<=n;i++) 73 sum+=dist[i]; 74 75 return sum; 76 } 77 78 int main() 79 { 80 int T,q,i,P; 81 scanf("%d", &T); 82 83 while(T--) 84 { 85 scanf("%d %d", &P,&q); 86 memset(head,0,sizeof(head)); 87 88 for(i=1;i<=q;i++) 89 { 90 scanf("%d %d %lld", &d[i].a,&d[i].b,&d[i].price); 91 Add(d[i].a,d[i].b,d[i].price,i); 92 } 93 94 long long sum; 95 96 sum=spfa(P); 97 98 memset(head,0,sizeof(head)); 99 for(i=1;i<=q;i++) 100 Add(d[i].b,d[i].a,d[i].price,i); 101 102 sum+=spfa(P); 103 104 printf("%lld ", sum); 105 } 106 return 0; 107 }