POJ1511(Invitation Cards)

题目链接

最短路的题,这题时间限制较严,第一次用dijkstra果断挂掉,后来改用SPFA写,由于我用的数据结构是动态链表,所以还是TLE,改为静态链表后就AC了。在这个过程中还贡献了一次WA,因为最后结果用32位会溢出,题中说的总价格不会超过1000000000是单个最短路不会超,而最后的结果是n-1个结点的最短路之和。

View Code
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <memory.h>
 4 #define INF 1000000001
 5 #define N 1000001
 6 #define MIN(a,b) ((a)<(b)?(a):(b))
 7 struct node
 8 {
 9     int v,w;
10     struct node *next;
11 };
12 int cnt;
13 struct node edge[2*N];
14 struct node *a[N],*b[N];
15 int dist[N],n,m;
16 int queue[N],front,rear;
17 char vis[N];
18 void addEdge(int u,int v,int w)
19 {
20     struct node *p,*q;
21     p=&edge[cnt++];
22     q=&edge[cnt++];
23     p->v=v,p->w=w;
24     p->next=a[u],a[u]=p;
25     q->v=u,q->w=w;
26     q->next=b[v],b[v]=q;
27 }
28 void SPFA(int u,struct node *list[])
29 {
30     int i,v;
31     struct node *p;
32     front=rear=0;
33     memset(vis,0,sizeof(vis));
34     for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
35     queue[rear++]=u;
36     while(front!=rear)
37     {
38         i=queue[front],front=(front+1)%N;
39         vis[i]=0;
40         for(p=list[i];p;p=p->next)
41         {
42             v=p->v;
43             if(dist[v]>dist[i]+p->w)
44             {
45                 dist[v]=dist[i]+p->w;
46                 if(!vis[v])
47                 {
48                     vis[v]=1;
49                     queue[rear]=v,rear=(rear+1)%N;
50                 }
51             }
52         }
53     }
54 }
55 int main()
56 {
57     int i,j,k,d,t;
58     long long ans;
59     scanf("%d",&t);
60     while(t--)
61     {
62         scanf("%d%d",&n,&m);
63         cnt=0;
64         for(i=0;i<m;i++)
65         {
66             scanf("%d%d%d",&j,&k,&d);
67             j--,k--;
68             addEdge(j,k,d);
69         }
70         ans=0;
71         SPFA(0,a);
72         for(i=1;i<n;i++)   ans+=dist[i];
73         SPFA(0,b);
74         for(i=1;i<n;i++)   ans+=dist[i];
75         printf("%lld\n",ans);
76         memset(a,0,sizeof(a));
77         memset(b,0,sizeof(b));
78     }
79     return 0;
80 }
原文地址:https://www.cnblogs.com/algorithms/p/2465052.html