您的位置:首页 > 其它

ACdream 1135 MST (最小生成树)

2014-07-12 20:18 267 查看
ACdream 1135 MST

题目链接:http://acdream.info/problem?pid=1135

根据L建立最小生成树,在L相同情况下维护C最小。Kruskal 算法一个快排处理之。

AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct edge 
{
	int x,y,l,c;
};
struct edge ed[100010];

int father[10010];

int find(int x)
{
	if(x==father[x])
		return x;
	return father[x]=find(father[x]);
}

bool cmp(edge a,edge b)
{
	if(a.l!=b.l)
		return a.l<b.l;
	if(a.c!=b.c)
		return a.c<b.c;//在L相同下维护C最小
	return false;
}

void solve(int n,int m)
{
	int fx,fy,i,count=0;
	int ans1=0,ans2=0;
	for(i=1;i<=n;i++)
		father[i]=i;
	sort(ed,ed+m,cmp);
	for(i=0;i<m;i++)
	{
		fx=find(ed[i].x);
		fy=find(ed[i].y);
		if(fx!=fy)
		{
			father[fx]=fy;
			ans1+=ed[i].l;
			ans2+=ed[i].c;
			count++;
		}
	}
	if(count==n-1)//是否是一课树。
		printf("%d %d\n",ans1,ans2);
	else
		printf("-1 -1\n");
}

int main ()
{
	int n,m;
	int i,a,b,l,c;
	
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		for(i=0;i<m;i++)
		{
			scanf("%d %d %d %d",&a,&b,&l,&c);
			ed[i].x=a,ed[i].y=b;
			ed[i].l=l,ed[i].c=c;
		}
		solve(n,m);
	}
	
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: