描述
N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离
输入描述:
第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路 接下来M行两个整数,表示相连的两个城市的编号
输出描述:
N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。
示例1
输入:
4 4 1 2 2 3 1 3 0 1
输出:
8 9 11
解题思路:
(1)利用佛洛依德算法的思想来求解;
(2)初始化结点的根结点;
(3)初始化i=i的情况,初始化路径len数组;
(4)不同根结点才录入,相同,证明已有路径到达,且因为第K条道路(K从0开始)的长度为2^K;
(5)佛洛依德算法
代码:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
const int INF=0x3f3f3f3f,mod=100000;
using namespace std;
int p[101];//定义根节点数组
int len[101][101];
int find(int x){ //找根结点
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) p[i]=i; //初始化根结点
memset(len,0x3f3f3f, sizeof(len)); //初始化
for(int i=0;i<n;i++) len[i][i]=0; //原地不动
for(int i=0,l=1;i<m;l=l*2%mod,i++){ //输入数据
int a,b;
cin>>a>>b;
if(find(a)!=find(b)){ //不同根结点
p[find(a)]=find(b); //定义根结点
len[a][b]=len[b][a]=l; //两城市路径相等
}
}
for(int k=0;k<n;k++){ //佛洛依德算法
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
len[i][j]=min(len[i][j], len[i][k]+len[k][j]);
}
}
}
for(int i=1;i<n;i++){
if(len[0][i]==INF) cout<<-1<<endl; //无法到达
cout<<len[0][i]%mod<<endl;
}
return 0;
}
PS:参考某佬的思想