题目看懂了,然而没注意看数组,肿么辣么大~~天真的用了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\n", 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\n", sum);
105     }
106     return 0;
107 }

 

posted on 2016-07-25 09:30  惟愿。。。  阅读(162)  评论(0编辑  收藏  举报