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 }

 

你可能感兴趣的:(poj)