求助50分,救命
查看原帖
求助50分,救命
37345
Serve楼主2021/9/23 15:38

虽然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);
} 
2021/9/23 15:38
加载中...