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\n",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\n",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;

}

  

你可能感兴趣的:(OJ)