您的位置:首页 > 其它

HDU 1301 Jungle Roads (最小生成树)

2015-06-02 16:51 471 查看

Jungle Roads

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5037 Accepted Submission(s): 3656


[align=left]Problem Description[/align]

#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <ctime>
using    namespace    std;

const    int    SIZE = 30;
int    FATHER[SIZE],N,NUM;
struct    Node
{
int    from,to,cost;
}G[100];

void    ini(void);
int    find_father(int);
void    unite(int,int);
bool    same(int,int);
int    kruskal(void);
bool    comp(const Node &,const Node &);
int    main(void)
{
char    ch;
int    from,to,cost,k;

while(scanf("%d",&N) && N)
{
ini();
for(int i = 0;i < N - 1;i ++)
{
scanf(" %c%d",&ch,&k);
from = ch - 'A';
while(k --)
{
scanf(" %c%d",&ch,&cost);
to = ch - 'A';
G[NUM].from = from;
G[NUM].to = to;
G[NUM].cost = cost;
NUM ++;
}
}
printf("%d\n",kruskal());
}

return    0;
}

void    ini(void)
{
NUM = 0;
for(int i = 0;i <= N;i ++)
FATHER[i] = i;
}

int    find_father(int n)
{
if(n == FATHER
)
return    n;
return    FATHER
= find_father(FATHER
);
}

void    unite(int x,int y)
{
x = find_father(x);
y = find_father(y);

if(x == y)
return    ;
FATHER[x] = y;
}

bool    same(int x,int y)
{
return    find_father(x) == find_father(y);
}

bool    comp(const Node & a,const Node & b)
{
return    a.cost < b.cost;
}

int    kruskal(void)
{
int    count = 0;
int    ans = 0;

sort(G,G + NUM,comp);
for(int i = 0;i < NUM;i ++)
if(!same(G[i].from,G[i].to))
{
unite(G[i].from,G[i].to);
ans += G[i].cost;
count ++;
if(count == N - 1)
break;
}
return    ans;
}


Kruskal
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: