【kruskal算法】POJ2485
题目:http://poj.org/problem?id=2485
思路
就是最小生成树啊
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
#define INTMAX 0x3f3f3f3f
typedef pair<int,int> pii;
typedef long long ll;
#define x first
#define y second
int rank[505];
int father[505];
int find_set(int x)
{
if (x!=father[x])
{
father[x]=find_set(father[x]);
}
return father[x];
}
void simply_union_set(int u,int v)
{
u=find_set(u);
v=find_set(v);
father[u]=v;
}
void perfect_union_set(int u,int v)
{
u=find_set(u);
v=find_set(v);
if (rank[u]>rank[v])
{
father[v]=u;
}
else
{
father[u]=v;
if(rank[u]==rank[v])
rank[v]++;
}
}
struct edge
{
int fr,to,w;
};
int num_case,num_v,result;
vector<edge> arr_edge;
void debug()
{
for(int i=0;i<arr_edge.size();i++)
{
cout<<arr_edge[i].fr<<" to "<<arr_edge[i].to<<"="<<arr_edge[i].w<<endl;
}
}
void init()
{
arr_edge.clear();
result=0;
}
void input()
{
int w;
scanf("%d",&num_v);
for(int i=0;i<num_v;i++)
{
for(int j=0;j<num_v;j++)
{
scanf("%d",&w);
if(i<j)
{
edge temp;
temp.fr=i;
temp.to=j;
temp.w=w;
arr_edge.push_back(temp);
}
}
}
}
bool mycompare(const edge& x,const edge &y)
{
return x.w<y.w;
}
void kruskal()
{
for(int i=0;i<num_v;i++)father[i]=i;
sort(arr_edge.begin(),arr_edge.end(),mycompare);
for(int i=0;i<arr_edge.size();i++)
{
int fr=arr_edge[i].fr;
int to=arr_edge[i].to;
int w=arr_edge[i].w;
if( find_set(fr)!=find_set(to))
{
result=max(result,w);
simply_union_set(fr,to);
}
}
}
void solve()
{
init();
input();
//debug();
kruskal();
cout<<result<<endl;
}
int main()
{
scanf("%d",&num_case);
while(num_case--)
{
solve();
}
return 0;
}