单源最短路90分求调
  • 板块P1613 跑路
  • 楼主hateful_bug
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/26 07:49
  • 上次更新2024/10/26 10:26:03
查看原帖
单源最短路90分求调
752711
hateful_bug楼主2024/10/26 07:49

wa#6

#include<bits/stdc++.h>
using namespace std;
int n,m,h[55],b[10005],nx[10005],tt,d[55];
bool f[55][55][33];
void zj(int x,int y)
{
	b[++tt]=y;
	nx[tt]=h[x];
	h[x]=tt;
}
void bfs()
{
	queue<int> q;
	q.push(1);
	d[1]=1;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=nx[i])
		{
			int y=b[i];
			if(d[y])
			continue;
			d[y]=d[x]+1;
			q.push(y);
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		f[x][y][0]=true;
	}
	for(int k=1;k<=32;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	for(int l=1;l<=n;l++)
	f[i][j][k]|=f[i][l][k-1]&f[l][j][k-1];
//	for(int i=1;i<=n;i++)
//	for(int j=1;j<=n;j++)
//	if(i!=j)
//	d[i][j]=10000000;
	for(int k=0;k<=32;k++) 
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	if(f[i][j][k])
	zj(i,j);
	bfs();
//	d[i][j]=1;
//	for(int k=1;k<=n;k++)
//	for(int i=1;i<=n;i++)
//	for(int j=1;j<=n;j++)
//	d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
	printf("%d",d[n]-1);
	return 0;
}
2024/10/26 07:49
加载中...