dijkstra求助
  • 板块P1613 跑路
  • 楼主return_dirt
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/11/3 09:00
  • 上次更新2023/11/5 09:09:03
查看原帖
dijkstra求助
180059
return_dirt楼主2020/11/3 09:00

权全1 所以一拍脑子写了个 dijstra 然后456WA

怀疑是dij写炸了就把P4779的板子搬过来了,依旧过不了4 5 6

求问一下 是我写的有问题 还是这个思路有问题?

#include <cstdio>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;

struct EDGE{
	int l;
	int to;
}edge_now[10000];
int head[60];
int cnt;
void add(int start,int end)
{
	cnt++;
	edge_now[cnt].l=head[start];
	edge_now[cnt].to=end;
	head[start]=cnt;
}

typedef pair<int,int> P;
priority_queue <P,vector<P>,greater<P> > q;

int vis[60];
int dis[60];

void dijkstra()
{
	dis[1]=0;
	q.push(make_pair(dis[1],1));
	while(!q.empty())
	{
		int point=q.top().second;
		q.pop();
		if(vis[point]==1)continue;
		vis[point]=1;
		for(int i=head[point];i;i=edge_now[i].l)
		{
			dis[edge_now[i].to]=min(dis[edge_now[i].to],dis[point]+1);
			q.push(make_pair(dis[edge_now[i].to],edge_now[i].to));
		}
	}
}


int n,m;
int a1,b1;
int edge[60][60][65];

signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld",&a1,&b1);
		edge[a1][b1][0]=1;
	}	
	for(int k=1;k<=64;k++)
	{
		for(int p1=1;p1<=n;p1++)
		{
			for(int p2=1;p2<=n;p2++)
			{
				for(int p3=1;p3<=n;p3++)
				{
					if(edge[p1][p3][k-1]&&edge[p3][p2][k-1])
					{
						edge[p1][p2][k]=1;
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=0;k<=64;k++)
			{
				if(edge[i][j][k]==1)
				add(i,j);
			}
		}
	}
	for(int i=2;i<=n;i++)dis[i]=0x3f3f3f;
	dis[1]=0;
	q.push(make_pair(0,1));
	dijkstra();
	printf("%lld",dis[n]);
	return 0;
} 
2020/11/3 09:00
加载中...