90pts求助
  • 板块P1613 跑路
  • 楼主diamond_153
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/12/23 22:49
  • 上次更新2023/10/24 06:49:39
查看原帖
90pts求助
751417
diamond_153楼主2022/12/23 22:49
#include<iostream>
using namespace std;
bool f[65][51][51]={0};//f[i][j][k]: j,k之间有长度为2^i的路线
int map[51][51]={0};//map[i][j]: i,j之间的最短路
int n,m;
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int x,y;cin>>x>>y;
        map[x][y]=f[0][x][y]=1;//初始化
    }
    for(int i=1;i<=64;i++)
        for(int u=1;u<=n;u++)
            for(int v=1;v<=n;v++)
                for(int w=1;w<=n;w++)
                    if(f[i-1][u][v]&&f[i-1][v][w])
                        map[u][w]=f[i][u][w]=1;//初始化,运用倍增思想
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                if(map[i][j]&&map[j][k]&&(!map[i][k]||map[i][j]+map[j][k]<map[i][k]))
                    map[i][k]=map[i][j]+map[j][k];//floyd,这里的 (!map[i][k]||map[i][j]+map[j][k]<map[i][k]) 的意思是i,k之间没有路或者i,k之间的路不是最优
    cout<<map[1][n];//从1到n的最短路
}

WA#3,求助

2022/12/23 22:49
加载中...