玄关
  • 板块P1613 跑路
  • 楼主文锡
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/17 10:26
  • 上次更新2024/9/17 13:49:44
查看原帖
玄关
941628
文锡楼主2024/9/17 10:26
#include<bits/stdc++.h>
using namespace std;
long long n, m;
long long dis[55][55];
bool G[55][55], f[35][35][35];
long long len=1;
void dp(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(G[i][j])
				f[0][i][j]=true;
	for(int i=1;i<=30;i++)
		for(int k=1;k<=n;k++)
			for(int u=1;u<=n;u++)
				for(int v=1;v<=n;v++)
					f[i][u][v]|=f[i-1][u][k]&f[i-1][k][v];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x, y;
		cin>>x>>y;
		G[x][y]=true;
	}
	dp();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j) dis[i][j]=1e9;
	for(int i=0;i<=30;i++)
		for(int u=1;u<=n;u++)
			for(int v=1;v<=n;v++)
				if(f[i][u][v]) dis[u][v]=min(dis[u][v],len);
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(k!=i && k!=j && i!=j)
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	cout<<dis[1][n]<<endl;
	return 0;
}

哪位好心人\color{red}好心人帮忙看看有什么问题

2024/9/17 10:26
加载中...