您的位置:首页 > 其它

九度 oj 题目1100:最短路径

2017-02-05 20:09 423 查看
http://ac.jobdu.com/problem.php?pid=1100

参考了http://blog.csdn.net/thudaliangrx/article/details/49357075

因为每条新边比之前所有边的和都要长,所以只要是当前边能联通的点对,点对当前的距离就是最短距离

#include <stdio.h>

static int folk[102];
static int d[102][102];
static int rank[102];

int find(int u){
return u == folk[u] ? u : folk[u] = find(folk[u]);
}

void unionSet(int a,int b){
int x = find(a);
int y = find(b);
if(x == y) return;
if(rank[x] >= rank[y]){
rank[x] += rank[y];
folk[y] = x;
}else{
rank[y] += rank[x];
folk[x] = y;
}
}

int mod (int n,int k){
int res = 1;
for (int i = 0; i < k; ++i) {
res *=n;
res %=100000;
}
return res;
}

int main(){
//freopen("in/1100.in","r",stdin);
//freopen("out/1100.tree.out","w",stdout);
int n,m,a,b;
while(scanf("%d %d",&n,&m) !=EOF ){
for (int i = 0; i < n; ++i) {
folk[i] = i;
d[i][i] = 0;
rank[i] = 1;
}
for (int i = 0; i < m; ++i) {
scanf("%d %d",&a,&b);
int dist = mod(2,i);

int x = find(a);
int y = find(b);
if(x == y) continue;
for (int j = 0; j < n; ++j) {
if( x != find(j)) continue;
for (int k = 0; k < n; ++k) {
if( y != find(k) ) continue;
d[j][k] = d[k][j] = (d[j][a] + dist + d[b][k] )%100000;
}
}
//unionSet(x,y);
folk[y] = x;
}

int root = find(0);
for (int i = 1; i < n; ++i) {
if(root != find(i) ) printf("-1\n");
else{
printf("%d\n",d[0][i]);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: