题目:
有向图中求1->n的最短时间
1单位时间可以走
2
k
2^k
2k单位长,(k为任意自然数)
题解:
可以看到n范围很小,可以考虑建邻接表
还要考虑各种联通方式,于是我们建出这种邻接表
m
p
[
x
]
[
y
]
[
i
]
=
1
表
示
x
−
>
y
有
2
i
长
的
路
径
mp[x][y][i]=1表示x->y有2^i长的路径
mp[x][y][i]=1表示x−>y有2i长的路径
再用这个更新
d
i
s
[
i
]
dis[i]
dis[i](到达i最短时间)
#include<bits/stdc++.h>
using namespace std;
const int N=55,M=1e4+10,INF=1e9;
int n,m;
bool mp[N][N][100];
int dis[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
mp[u][v][0]=1;
}
for(int i=1;i<=50;i++)
for(int x=1;x<=n;x++)
for(int y=1;y<=n;y++)
for(int k=1;k<=n;k++)
mp[x][y][i]|=mp[x][k][i-1]&mp[k][y][i-1];
for(int i=1;i<=n;i++)dis[i]=INF;
dis[1]=0;
for(int i=0;i<=50;i++)
for(int y=1;y<=n;y++)
{
for(int x=1;x<=n;x++)
{
if(mp[x][y][i])dis[y]=min(dis[y],dis[x]+1);
}
}
printf("%d",dis[n]);
}