poj 1511 两次SPFA+邻接表

题意就不说了,说下注意的地方,第一数据量很大必须用邻接表,第二输入的边有重边,第三题目给的最大和的范围有错,应给用64位。这样都注意了再加上SPFA就可以顺利的PASS。

View Code
  1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5 const int N=1000005;
6 const int inf=1000000000;
7 struct ss{
8 int y,value,next;
9 }edge[N],redge[N];
10 int head[N],rhead[N],vist[N];
11 int dist[N],rdist[N];
12 int e[N];
13 __int64 ans;
14 void SPFA()
15 {
16 int re,rc,v,i;
17 dist[1]=0;
18 e[0]=1;
19 re=0;rc=1;
20 vist[1]=1;
21 while (re<rc)
22 {
23 v=e[re++];
24 for (i=head[v];i;i=edge[i].next)
25 if (dist[edge[i].y]>=dist[v]+edge[i].value)
26 {
27 dist[edge[i].y]=dist[v]+edge[i].value;
28 if(!vist[edge[i].y])
29 {
30 e[rc++]=edge[i].y;
31 vist[edge[i].y]=1;
32 }
33 }
34 vist[v]=0;
35 }
36 }
37 void RSPFA()
38 {
39 int re,rc,v,i;
40 rdist[1]=0;
41 e[0]=1;
42 re=0;rc=1;
43 vist[1]=1;
44 while (re<rc)
45 {
46 v=e[re++];
47 for (i=rhead[v];i;i=redge[i].next)
48 if (rdist[redge[i].y]>=rdist[v]+redge[i].value)
49 {
50 rdist[redge[i].y]=rdist[v]+redge[i].value;
51 if(!vist[redge[i].y])
52 {
53 e[rc++]=redge[i].y;
54 vist[redge[i].y]=1;
55 }
56 }
57 vist[v]=0;
58 }
59 }
60
61 int n;
62 int main()
63 {
64 int i,j,k,x,y,z,m,W,D,flag;
65 scanf("%d",&k);
66 while (k--)
67 {
68
69 W=D=1;
70 scanf("%d%d",&n,&m);
71 memset(head,0,sizeof(head));
72 memset(rhead,0,sizeof(rhead));
73 for (i=1;i<=m;i++)
74 {
75 scanf("%d%d%d",&x,&y,&z);
76 flag=0;
77 for (j=head[x];j;j=edge[j].next)
78 if(edge[j].y==y)
79 {
80 flag=1;
81 if(edge[j].value>z)
82 edge[j].value=z;
83 }
84 if(!flag)
85 {
86 edge[W].y=y;
87 edge[W].value=z;
88 edge[W].next=head[x];
89 head[x]=W++;
90 }
91 }
92 for (i=1;i<=n;i++)
93 for (j=head[i];j;j=edge[j].next)
94 {
95 redge[D].y=i;
96 redge[D].value=edge[j].value;
97 redge[D].next=rhead[edge[j].y];
98 rhead[edge[j].y]=D++;
99 }
100
101 for (i=1;i<=n;i++)
102 {
103 vist[i]=0;
104 dist[i]=inf;
105 rdist[i]=inf;
106 }
107 SPFA();
108 memset(vist,0,sizeof(vist));
109 RSPFA();
110 ans=0;
111 for (i=1;i<=n;i++)
112 {
113 ans+=dist[i];
114 ans+=rdist[i];
115 }
116
117 printf("%I64d\n",ans);
118 }
119 return 0;
120 }
posted @ 2011-08-25 14:11  我们一直在努力  阅读(216)  评论(0编辑  收藏  举报