• hdoj 1233 还是畅通工程


    并查集+最小生成树

    还是畅通工程

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 29762    Accepted Submission(s): 13297


    Problem Description
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。
     
    Output
    对每个测试用例,在1行里输出最小的公路总长度。
     
    Sample Input
    3
    1 2 1
    1 3 2
    2 3 4
    4
    1 2 1
    1 3 4
    1 4 1
    2 3 3
    2 4 2
    3 4 5
    0
     
    Sample Output
    3
    5
     
     kruskal算法
    #include<stdio.h>
    #include<algorithm>
    int set[110];
    using namespace std;
    struct record
    {
    	int beg;
    	int end;  
    	int ju;  //两村庄之间距离 
    }s[10000];
    int find(int fa)  //寻找根节点 
    {
    	int ch=fa;
    	int t;
    	while(fa!=set[fa])
    	fa=set[fa];
    	while(ch!=fa)
    	{
    		t=set[ch];
    		set[ch]=fa;
    		ch=t;
    	}
    	return fa;
    }
    void mix(int x,int y) //合并已有村庄 
    {
    	int fx,fy;
    	fx=find(x);
    	fy=find(y);
    	if(fx!=fy)
    	set[fx]=fy;
    }
    bool cmp(record a,record b)
    {
    	return a.ju<b.ju;   //将两村庄之间距离从小到大排列 
    }
    int main()
    {
    	int n,m,j,i,sum,l;
    	while(scanf("%d",&n)&&n!=0)
    	{
    		for(j=1;j<=n;j++)
    		{
    			set[j]=j;
    		}
    		m=n*(n-1)/2;
    		for(i=0;i<m;i++)
    		{
    			scanf("%d%d%d",&s[i].beg,&s[i].end,&s[i].ju);
    	    }
    		sort(s,s+m,cmp);
    		sum=0;		
    		for(i=0;i<m;i++)
    		{
    			if(find(s[i].beg)!=find(s[i].end))  //选择最短路径 
    			{
    			    mix(s[i].beg,s[i].end);   
    			    sum+=s[i].ju;
    			}	    
    		}
    		printf("%d
    ",sum);		
    	}
    	return 0;
    }
    

     prime算法

    #include<stdio.h>
    #include<string.h>
    #define INF 0x3f3f3f
    int city;
    int lowdis[110],map[110][110],visit[110];
    void prime()
    {
    	int j,i,min,mindis,next;
    	mindis=0;
    	memset(visit,0,sizeof(visit));
    	for(i=1;i<=city;i++)
    	{
    		lowdis[i]=map[1][i];
    	}
    	visit[1]=1;
    	for(i=1;i<city;i++)
    	{
    		min=INF;
    		for(j=1;j<=city;j++)
    		{
    			if(!visit[j]&&min>lowdis[j])
    			{
    				min=lowdis[j];
    				next=j;
    			}
    		}
    		mindis+=min;
    		visit[next]=1;
    		for(j=1;j<=city;j++)
    		{
    			if(!visit[j]&&lowdis[j]>map[next][j])
    			{
    				lowdis[j]=map[next][j];
    			}
    		}
    	}
    	printf("%d
    ",mindis);
    }
    int main()
    {
    	int m,i,x,y,c;
    	while(scanf("%d",&city)&&city!=0)
    	{
    		memset(map,INF,sizeof(map));
    		m=(city*(city-1))/2;
    		while(m--)
    		{
    			scanf("%d%d%d",&x,&y,&c);
    			map[x][y]=map[y][x]=c;
    		}
    		prime();
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    利用window.onerror收集js代码异常
    js 基础题复习
    正则12和\1的理解
    CodeReview 方法 规范
    前端的登陆 几种类型
    http协议相关知识
    javascript中apply、call和bind的区别 详细易懂
    http常见的状态码,400,401,403 前端看
    vue中使用file-saver 下载各类文件
    js下载文件到本地各种方法总结
  • 原文地址:https://www.cnblogs.com/tonghao/p/4466942.html
Copyright © 2020-2023  润新知