90pts求助

P1613 跑路

你这 $floyd$ 应该赋初值memset(map,0x3f,sizeof(map)) 直接用0去是不行的
by Rain_chr @ 2022-12-29 10:31:01


@[diamond_153](/user/751417) 并且你这floyd写假了,j在最外面
by Rain_chr @ 2022-12-29 10:33:44


帮你A了(map改成了mp,因为那是关键字,下次别用了) ```cpp #include<bits/stdc++.h> using namespace std; bool f[65][51][51]={0};//f[i][j][k]: j,k之间有长度为2^i的路线 int mp[51][51]={0};//mp[i][j]: i,j之间的最短路 int n,m; int main(){ memset(mp,0x3f,sizeof(mp)); ios::sync_with_stdio(false); cin>>n>>m; for(int i=0;i<m;i++){ int x,y;cin>>x>>y; mp[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]) mp[u][w]=f[i][u][w]=1;//初始化,运用倍增思想 for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[i][j]+mp[j][k]<mp[i][k]) mp[i][k]=mp[i][j]+mp[j][k];//floyd,这里的 (!mp[i][k]||mp[i][j]+mp[j][k]<mp[i][k]) 的意思是i,k之间没有路或者i,k之间的路不是最优 cout<<mp[1][n];//从1到n的最短路 } ```
by Rain_chr @ 2022-12-29 10:35:38


@[违规用户名684254](/user/684254) 其实map你不 `#include<map>` 也能用,不过%%%
by diamond_153 @ 2022-12-29 10:49:30


|