虽然SPFA死了,但我不知死活地又用了(裂开
求dalao救命!
#include<cstdio>
using namespace std;
int n,m;
int len1,tail[10005],nex[202005],a[202005];
int len2,Tail[10005],Nex[202005],A[202005]; //邻接表
int vis1[10005],vis2[10005];
int time1[10005],time2[10005],cos1[10005],cos2[10005];
int q[2000005];
void add(int x,int y,int z)//正向建边
{
len1++;
a[len1]=y;
nex[tail[x]]=len1;
tail[x]=len1;
time1[len1]=z;
}
void Add(int x,int y,int z)//反向建边
{
len2++;
A[len2]=y;
Nex[Tail[x]]=len2;
Tail[x]=len2;
time2[len2]=z;
}
void spfa1()//正向跑SPFA
{
int l=1,r=1;
q[1]=1,vis1[1]=1;
for(int i=1;i<=n;i++)
cos1[i]=-1;
cos1[1]=0;
while(l<=r)//手打队列(太土了
{
int x=q[l];
l++;
vis1[x]=0;
for(int i=nex[x];i!=0;i=nex[i])
{
int y=a[i];
if(cos1[x]+time1[i]<cos1[y] || cos1[y]==-1)
{
cos1[y]=cos1[x]+time1[i];
if(vis1[y]==0)
vis1[y]=1,q[++r]=y;
}
}
}
}
void spfa2()//反向建边
{
int l=1,r=1;
q[1]=1,vis2[1]=1;
for(int i=1;i<=n;i++)
cos2[i]=-1;
cos2[1]=0;
while(l<=r)
{
int x=q[l];
l++;
vis2[x]=0;
for(int i=Nex[x];i!=0;i=Nex[i])
{
int y=A[i];
if(cos2[x]+time2[i]<cos2[y] || cos2[y]==-1)
{
cos2[y]=cos2[x]+time2[i];
if(vis2[y]==0)
vis2[y]=1,q[++r]=y;
}
}
}
}
int main()
{
int x,y,z;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
tail[i]=++len1;
Tail[i]=++len2;
}//邻接表的一部分
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
Add(y,x,z);
}
spfa1();//第一遍似乎没错
spfa2(); //啊我不懂,我的第二遍SPFA总是出错,可我是拿第一遍spfa的代码复制粘贴的QAQ
int a=0,b=0;
for(int i=2;i<=n;i++)
a=a+cos1[i],b=b+cos2[i];
printf("%d",a+b);
}