这题骗30分的最短路计数哪里错了?请大佬帮忙看看
查看原帖
这题骗30分的最短路计数哪里错了?请大佬帮忙看看
66263
Jack_cjj楼主2020/10/17 11:10
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int myinf=100000001;
int cnt;
int next[1000010];
int en[1000010];
int num[1000010];
int fir[1000010];
int dis[1000010];
int team[10000010];
int b[1000010];
int ans[1000010];
int minl;
int t;
int n,m,k,p; 
int x,y,z;
int left1,right1;
void add(int u,int v,int len)
{
	cnt++;
	next[cnt]=fir[u];
	fir[u]=cnt;
	en[cnt]=v;
	num[cnt]=len;
}
int main()
{
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		cnt=0;
		scanf("%d %d %d %d",&n,&m,&k,&p);
		for(int j=1;j<=m;j++)
		{
			scanf("%d %d %d",&x,&y,&z);
			add(x,y,z);
		}
		for(int j=1;j<=n;j++)
			dis[j]=myinf;
		for(int j=1;j<=n;j++)
			b[j]=0;
		ans[1]=1;
		left1=1;
		right1=1;
		dis[1]=0;
		b[1]=1;
		team[1]=1;
		while(left1<=right1)
		{
			int u=team[left1];
			for(int kk=fir[u];kk;kk=next[kk])
			{
				if(dis[en[kk]]>dis[u]+num[kk])
				{
					dis[en[kk]]=dis[u]+num[kk];
					ans[en[kk]]=ans[u];
					if(b[en[kk]]==0)
					{
						right1++;
						team[right1]=en[kk];
						b[en[kk]]=1;
					}
				}
				else 
				if(dis[en[kk]]==dis[u]+num[kk])
				{
					ans[en[kk]]=ans[en[kk]]+ans[u];
					ans[en[kk]]=ans[en[kk]]%p;
				}
			}
			left1++;
			b[u]=0;
		}
		for(int j=1;j<=n;j++)
			printf("%d ",ans[j]);//输出答案 
		printf("\n");
		cnt=0;
		for(int j=1;j<=m;j++)
			{
				fir[j]=0;
				en[j]=0;
				next[j]=0;
				num[j]=0;//清零 
			}
	}
	return 0; 
} 
2020/10/17 11:10
加载中...