您的位置:首页 > 其它

HDU 1879 继续畅通工程(Kruskal求最小生成树)

2016-03-07 16:28 537 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1879

思路:把已经建成的路设置为0即可

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;

struct node
{
int a,b;
int value;
}road[5000];

int pre[110];

bool cmp(node a,node b)
{
return a.value < b.value;
}

int find(int x)
{
return x == pre[x] ? x : pre[x] = find(pre[x]);
}

int Kruskal(int sum1)
{
int sum = 0;
for(int i=0; i<sum1; i++)
{
int a = find(road[i].a);
int b = find(road[i].b);
if(a != b)
{
pre[a] = b;
sum += road[i].value;
}
}
return sum;
}

int main()
{
int n;
while(scanf("%d",&n) && n)
{
int sum1 = n*(n-1)/2;
int sum = 0;
int a,b,c,d;
for(int i=1; i<=n; i++)
{
pre[i] = i;
}
for(int i=0; i<sum1; i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
road[i].a = a;
road[i].b = b;
road[i].value = c;
if(d == 1)
road[i].value = 0;
}
sort(road,road+sum1,cmp);
sum = Kruskal(sum1);
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: