最小生成树,Kruskal模板题。
这题真他妈的坑爹,要不是看了龙哥博客,还不知道那行 80 字符是坑爹加没用的呢。这题不知道坑了多少人!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
struct vertex
{
int val;
int u;
int v;
};
priority_queue<vertex> q;
int minx;
bool operator< (const vertex &a,const vertex &b)
{
if(a.val > b.val) return 1;
else return 0;
}
int id[110],sz[110];
bool cnet(int p,int q)
{
int i,j;
for(i = p;i != id[i];i = id[i]);
for(j = q;j != id[j];j = id[j]);
if(i == j) return 0;
if(sz[i] < sz[j])
{
id[i] = j;sz[j] += sz[i];
}
else
{
id[j] = i;sz[i] += sz[j];
}
return 1;
}
void kru()
{
while(!q.empty())
{
if(cnet(q.top().u,q.top().v) == 1)
minx += q.top().val;
q.pop();
}
}
int main()
{
int i,u,v,w,n;
vertex tmp;
while(scanf("%d",&n)!=EOF)
{
for(i = 0;i < 110;i ++) {id[i] = i;sz[i] = i;}
for(u = 1;u <= n;u ++)
for(v = 1;v <= n;v ++)
{
scanf("%d",&w);
if(v > u){
tmp.val = w;
tmp.u = u;
tmp.v = v;
q.push(tmp);
}
}
minx = 0;
kru();
printf("%d\n",minx);
while(!q.empty()) q.pop();
}
return 0;
}