1 条题解
-
0
C :
#include<stdio.h> const int inf=1000000000; const int mod=100000; int p[101],rank[101],d[101][101]; int Find(int i) { if(i==p[i]) return i; else { p[i]=Find(p[i]); return p[i]; } } void Union(int a,int b) { int ta=Find(a),tb=Find(b); if(ta==tb) return; if(rank[a]>=rank[b]) { p[tb]=ta; rank[ta]+=rank[tb]; } else { p[ta]=tb; rank[tb]+=rank[ta]; } } int Pow( long a,long b) { long ret=1; while(b>0) { if(b&1) ret=(ret*a)%mod; b>>=1; a=(a*a)%mod; } return ret; } int main() { int n,m,i,j,k,a,b,ta,tb,dist; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { p[i]=i; rank[i]=1; d[i][i]=0; } for(k=0;k<m;k++) { scanf("%d%d",&a,&b); ta=Find(a); tb=Find(b); if(ta==tb) continue; dist=Pow(2,k); for(i=0;i<n;i++) { if(Find(i)!=ta) continue; for(j=0;j<n;j++) { if(Find(j)!=tb) continue; d[i][j]=(d[i][a]+dist+d[b][j])%mod; d[j][i]=d[i][j]; } } Union(a,b); } ta=Find(0); for(i=1;i<n;i++) { if(Find(i)==ta) printf("%d\n",d[0][i]); else printf("-1\n"); } } return 0; }
C++ :
#include<stdio.h> const int inf=1000000000; const int mod=100000; int p[101],rank[101],d[101][101]; int Find(int i) { return i==p[i]?i:p[i]=Find(p[i]); } void Union(int a,int b) { int ta=Find(a),tb=Find(b); if(ta==tb) return; if(rank[a]>=rank[b]) { p[tb]=ta; rank[ta]+=rank[tb]; } else { p[ta]=tb; rank[tb]+=rank[ta]; } } int Pow(long long a,long long b) { long long ret=1; while(b>0) { if(b&1) ret=(ret*a)%mod; b>>=1; a=(a*a)%mod; } return ret; } int main() { int n,m,i,j,k,a,b,ta,tb,dist; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { p[i]=i; rank[i]=1; d[i][i]=0; } for(k=0;k<m;k++) { scanf("%d%d",&a,&b); ta=Find(a); tb=Find(b); if(ta==tb) continue; dist=Pow(2,k); for(i=0;i<n;i++) { if(Find(i)!=ta) continue; for(j=0;j<n;j++) { if(Find(j)!=tb) continue; d[i][j]=(d[i][a]+dist+d[b][j])%mod; d[j][i]=d[i][j]; } } Union(a,b); } ta=Find(0); for(i=1;i<n;i++) { if(Find(i)==ta) printf("%d\n",d[0][i]); else printf("-1\n"); } } return 0; }
Java :
import java.math.BigDecimal; import java.math.BigInteger; import java.util.Scanner; public class Main { final static BigDecimal INF = new BigDecimal(2).pow(10002); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int N = scanner.nextInt(); int M = scanner.nextInt(); BigDecimal[][] matrix = new BigDecimal[N][N]; boolean[] visit = new boolean[N]; BigDecimal[] dis = new BigDecimal[N]; // initial for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) matrix[i][j] = INF; for (int i = 0; i < N; i++) matrix[i][i] = new BigDecimal(0); for (int i = 0; i < N; i++) visit[i] = false; // assignment for (int i = 0; i < M; i++) { int a = scanner.nextInt(); int b = scanner.nextInt(); if (matrix[a][b] == INF) { //注意:同一条边不能重复赋值 BigDecimal weight = new BigDecimal(2).pow(i); matrix[b][a] = matrix[a][b] = weight; } } for (int i = 0; i < N; i++) dis[i] = matrix[0][i]; // shortest path int next = 0; visit[0] = true; for (int i = 1; i < N; i++) { // repeat N-1 times for (int j = 1; j < N; j++) { if (!visit[j]) { if (dis[j].compareTo(dis[next].add(matrix[next][j])) > 0) dis[j] = dis[next].add(matrix[next][j]); } } BigDecimal min = INF; for (int j = 1; j < N; j++) { if (!visit[j]) { if (dis[j].compareTo(min) < 0) { min = dis[j]; next = j; } } } visit[next] = true; } for (int i = 1; i < N; i++) { if (dis[i].compareTo(INF) < 0) System.out.println(dis[i].toBigInteger().mod(new BigInteger("100000"))); else System.out.println(-1); } } scanner.close(); } }
- 1
信息
- ID
- 1138
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者