题目描述
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
由于2^K可以非常大,如果单纯最短路套模板,在比较路径大小的地方就超范围了。而2^k是有规律的
每次加入的路径都比之前加入的所有路径之和大1,那么如果本来输入两端a,b。a与b已经连通了,那
就没必要加入这条新路径了,但如果a,b分别属于两个连通图,那么他们分别的点到对方的点必然会通
过新加入的路径。所以就维护一个连通图各个点的最短距离,然后更新就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=1e5;
const int maxn=1e2;
int pra[maxn],Rank[maxn],dis[maxn][maxn];
int finding(int num);
void init(int n);
int main()
{
int n,m,len,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
len=1;
init(n);
for(int i=0; i<m; i++,len=len*2%mod)
{
scanf("%d%d",&am