• 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("
    ");      	
        }
    }
    

      

     
  • 相关阅读:
    DataTable.Compute功能
    ip的划分,超详细
    静态页 htm传参数
    [你必须知道的.NET] 第四回:后来居上:class和struct
    [你必须知道的.NET] 第八回:品味类型值类型与引用类型(上)-内存有理
    [你必须知道的.NET] 第五回:深入浅出关键字把new说透
    作废
    XML Schema <第三篇>
    XML基础<第一篇>
    NHibernate之配置文件属性说明
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4250842.html
Copyright © 2020-2023  润新知