1 条题解

  • 0
    @ 2025-4-7 21:19:28

    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
    上传者