zoukankan      html  css  js  c++  java
  • HDU 2122 Ice_cream’s world III【最小生成树】

    解题思路:基础的最小生成树
    反思:不明白为什么i从1开始取,就一直WA,难道是因为村庄的编号是从0开始的吗

    Ice_cream’s world III

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1032    Accepted Submission(s): 335

    Problem Description
    ice_cream’s world becomes stronger and stronger; every road is built as undirected. The queen enjoys traveling around her world; the queen’s requirement is like II problem, beautifies the roads, by which there are some ways from every city to the capital. The project’s cost should be as less as better.
     
    Input
    Every case have two integers N and M (N<=1000, M<=10000) meaning N cities and M roads, the cities numbered 0…N-1, following N lines, each line contain three integers S, T and C, meaning S connected with T have a road will cost C.
     
    Output
    If Wiskey can’t satisfy the queen’s requirement, you must be output “impossible”, otherwise, print the minimum cost in this project. After every case print one blank.
     
    Sample Input
    2 1 0 1 10 4 0
     
    Sample Output
    10 impossible
     
    Author
    Wiskey
    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;
    int pre[10010];
    struct Edge
    {
    
        int u,v,w;
    } edge[10010];
    bool cmp(Edge n1,Edge n2)
    {
       return n1.w<n2.w;
    }
    int find(int root)
    { 
       return root == pre[root] ? root : pre[root] = find(pre[root]); 
    }
    int unionroot(int x,int y)
    {
    	int root1=find(x);
    	int root2=find(y);
    	if(root1==root2)
    	return 0;
    	pre[root1]=root2;
    	return 1;
    }
    int main()
    {
        int n,m,i,j,tmp,x,y,ans;
        while(scanf("%d %d",&n,&m)!=EOF)
        {
        	tmp=0;
        	ans=0;
            for(i=0;i<=10010;i++)
            pre[i]=i;
            for(i=0;i<m;i++)
            scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);
            
            sort(edge,edge+m,cmp);
            for(i=0;i<m;i++)
            {
            	x=find(edge[i].u);
            	y=find(edge[i].v);
            	if(unionroot(x,y))
            	{
            		ans+=edge[i].w;
            		tmp++;
            	}     	
            }
            if(tmp!=n-1)
            printf("impossible
    ");
            else
            printf("%d
    ",ans); 
    		printf("
    ");      	
        }
    }
    

      

     
  • 相关阅读:
    pcr的简单小脚本
    Q宠大乐斗自动玩
    Docker安装elsearch
    elasticserarch6.5.0百度云资源
    rabbitmq安装
    排序后分组取每个分组的第一条数据
    Lambda表达式的简单使用
    解决SpringBoot总是找不到jsp
    Java强转类型时报错
    iOS内购图文流程(2017)
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4250842.html
Copyright © 2011-2022 走看看