P6770 [USACO05MAR]Checking an Alibi 不在场的证明(spfa)

不在场的证明

题目传送门

解题思路

这题就和香甜的黄油(SPFA)差不多,改个输入和输出就AC了

AC代码

#include
#include
#include
#include
using namespace std;
int n,p,c,m,x,y,z,o,x1,tot,head,tail,hd[100005],b[10005],v[10005],f[10005],d[10005];
struct stu
{
	int to,next,w;
}a[100005];
void add(int x,int y,int z)//建邻接表
{
	tot++;
	a[tot].to=y;
	a[tot].w=z;
	a[tot].next=hd[x];
	hd[x]=tot;
}
void spfa(int x)//spfa
{
	memset(v,0,sizeof(v));//初值
	memset(d,127,sizeof(d));
	d[x]=0,v[x]=1;f[1]=x;
	head=0;tail=1;
	while(head<tail)
	{
		head++;
		x1=f[head];
		for(int j=hd[x1];j;j=a[j].next)
		 if(d[a[j].to]>d[x1]+a[j].w)//松弛算法
		  {
			d[a[j].to]=d[x1]+a[j].w;
			if(v[a[j].to]==0)
			{
				tail++;
				v[x1]=1;//标记
				f[tail]=a[j].to;//入队
			}
		 }
		v[x1]=0;
	} 
}
int main()
{
	scanf("%d%d%d%d",&n,&p,&c,&m);//输入
	for(int i=1;i<=p;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);add(y,x,z);//无向
	}	
	for(int i=1;i<=c;i++)
	{
		scanf("%d",&x);
		spfa(x);
		if(d[1]<=m)b[++o]=i;//判断
	}
	cout<<o<<endl;//输出
	for(int i=1;i<=o;i++)
	 cout<<b[i]<<endl;
}

谢谢

你可能感兴趣的:(最短路径)