求助SPFA,感觉思路没问题,单向边

P1629 邮递员送信

大概是松弛的时候爆int了。 别用2147483647,用0x3f3f3f.
by Smokey_Days @ 2018-07-01 07:52:40


楼上正解,你的 ```cpp if(dis[i]>dis[s]+road[s][i]) ``` 这句话不等号右边可能变成负值。 @[ZXZ695](/space/show?uid=59946)
by 北极鹅 @ 2018-07-01 08:00:05


改了好久,还是WA...@[北极鹅](/space/show?uid=29277) @[Smokey_Days](/space/show?uid=97512) ``` #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long int n,m,road[1005][1005],q[300015],dis[1005],flag[1005]; long int x[100005],y[100005],z[100005]; void star() { memset(dis,0x3f3f3f,sizeof(dis));; } void scan1() { scanf("%ld%ld",&n,&m); memset(road,0x3f3f3f,sizeof(road)); for(int i=1;i<=m;i++) { scanf("%ld%ld%ld",&x[i],&y[i],&z[i]); road[x[i]][y[i]]=z[i]; } } void scan2() { memset(road,0x3f3f3f,sizeof(road)); for(long int i=1;i<=m;i++) road[y[i]][x[i]]=z[i]; } long int print() { long int tot=0; for(long int i=2;i<=n;i++) tot+=dis[i]; return tot; } void Spfa() { q[1]=1; dis[1]=0; flag[1]=1; long int s; long int head=0,tail=1; while(head<tail) { head++; s=q[head]; flag[s]=0; for(long int i=1;i<=n;i++) { if(i==s)continue; if(road[s][i]>10000)continue; if(dis[i]>dis[s]+road[s][i]) { dis[i]=dis[s]+road[s][i]; if(!flag[i]) { tail++; q[tail]=i; flag[i]=1; } } } } } int main() { star(); scan1(); Spfa(); long int ans1=0; ans1=print(); memset(flag,0,sizeof(flag)); memset(q,0,sizeof(q)); long int ans2=0; scan2(); star(); Spfa(); ans2=print(); printf("%ld",(ans1+ans2)); } ```
by ZXZ695 @ 2018-07-01 11:43:06


|