题目描述
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 的结果输出。
样例输入
4 3
0 1
1 2
2 0
样例输出
1
3
-1
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 100;
const int inf = 1000000000;
int n, m; //n个城市,m条道路
int G[maxn][maxn];
int d[maxn];
bool vis[maxn] = {false};
int length(int i)
{
return (int)pow(2,i);
}
void dij(int s)
{
fill(d, d+maxn, inf);
d[s] = 0;
for(int i = 0; i < n; i++)
{
int u = -1, min = inf;
for(int j = 0; j < n; j++)
{
if(vis[j] == false && d[j] < min)
{
u = j;
min = d[j];
}
}
if(u == -1) return;
vis[u] = true;
for(int v = 0; v < n; v++)
{
if(vis[v] == false && G[u][v] != inf && d[u]+G[u][v] < d[v])
{
d[v] = (d[u] + G[u][v]);
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
fill(G[0], G[0]+maxn*maxn, inf);
for(int i = 0; i < m; i++)
{
int a,b;
scanf("%d%d", &a, &b);
G[a][b] = length(i);
G[b][a] = length(i);
}
dij(0);
for(int i = 0; i < n; i++)
{
if(i == n - 1 && d[i] != 0)
{
if(d[i] == inf) printf("-1");
else printf("%d", d[i] % 100000);
}else
{
if(d[i] == inf) printf("-1\n");
else if(d[i] == 0) continue;
else printf("%d\n", d[i] % 100000);
}
}
return 0;
}
WA原因:错误50%,没找到原因..