zoukankan      html  css  js  c++  java
  • hdoj 1879 继续畅通工程

    并查集+最小生成树

    继续畅通工程

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 16278    Accepted Submission(s): 7010


    Problem Description
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
     
    Input
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。

    当N为0时输入结束。
     
    Output
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
     
    Sample Input
    3
    1 2 1 0
    1 3 2 0
    2 3 4 0
    3
    1 2 1 0
    1 3 2 0
    2 3 4 1
    3
    1 2 1 0
    1 3 2 1
    2 3 4 1
    0
     
       
    Sample Output
    3
    1
    0
    kruskal算法
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int set[110];
    struct record
    {
    	int beg;
    	int end;
    	int ju;
    	int tai;
    }s[11000];
    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,city;
    	while(scanf("%d",&city)&&city!=0)
    	{
    		for(i=0;i<=city;i++)
    		set[i]=i;
    		n=city*(city-1)/2;
    		for(i=0;i<n;i++)
    		{
    			scanf("%d%d%d%d",&s[i].beg,&s[i].end,&s[i].ju,&s[i].tai);
    		}
    		sort(s,s+n,cmp);
    		for(i=0;i<n;i++)
    		{
    			if(s[i].tai==1)   //此处将所有已修道路连接 
    			mix(s[i].beg,s[i].end);			
    		}
    		sum=0;
    		for(i=0;i<n;i++)
    		{
    			if(s[i].tai==0)   
    			{
    				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 lowcost[110],map[110][110],visit[110];
    void prime()
    {
    	int min,j,i,mincost=0,next;
    	memset(visit,0,sizeof(visit));
    	for(i=1;i<=city;i++)
    	{
    		lowcost[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>lowcost[j])
    			{
    				min=lowcost[j];
    				next=j;
    			}
    		}
    	    mincost+=min;
    	    visit[next]=1;
    	    for(j=1;j<=city;j++)
    	    {
    		    if(!visit[j]&&lowcost[j]>map[next][j])
    		    lowcost[j]=map[next][j];
    	    }
    	}
    	printf("%d
    ",mincost);
    }
    int main()
    {
    	int m,j,i,sum,x,y,c,d;
    	while(scanf("%d",&city)&&city!=0)
    	{
    		memset(map,INF,sizeof(map));
    		m=city*(city-1)/2;
    		while(m--)
    		{
    			scanf("%d%d%d%d",&x,&y,&c,&d);
    			if(d==1)
    			map[x][y]=map[y][x]=0;
    			else
    			map[x][y]=map[y][x]=c;
    		}
    		prime();
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    区间树
    最大流
    单源最短路径
    散列表
    最小生成树
    软件体系结构2
    软件体系结构
    Leetcode 687.最长同值路径
    Leetcode 686.重复叠加字符串匹配
    Python测试框架
  • 原文地址:https://www.cnblogs.com/tonghao/p/4467056.html
Copyright © 2011-2022 走看看