在学最小生成树, 于是打算在网上搜一道裸题连连手, 结果一搜出来就是poj1258, 可怕。
看了题, 用我所剩不多的英语知识余额读了读题, 《农民约翰当上了市长!》刚一读到这儿我就想:这设定怎么这么像美国一氧化碳上挤牛奶的农夫设定???
读完了才发现, 还tmd真是啊!
呵呵哒!
不多说了,粘程序了,反正在poj上也没过,而且这么丑陋肯定也不会有人抄。。。是吧?
有人要抄吗???想起还有点硝基冻呢!
Kruskal的:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1e9
using namespace std;
int n, ans = 0, p = 1;
int a[110][110], father[110];
struct node
{
int x, y, num;
} edge[5000];
bool cmp(node a, node b)
{
return a.num < b.num;
}
int getfather(int n)
{
if( father[n] == n ) return n;
father[n] = getfather(father[n]);
return (father[n]);
}
int main()
{
while(~scanf( "%d", &n ))
{
if ( n == 1 )
{
printf("2\n");
return 0;
}
int size = 0;
for( int i = 1; i <= n; i++ )
{
for( int j = 1; j <= n; j++ )
{
scanf( "%d", &a[i][j] );
if ( j > i )
{
size ++;
edge[size].x = i;
edge[size].y = j;
edge[size].num = a[i][j];
}
}
}
for( int i = 1; i <= n; i++ ) father[i] = i;
sort( edge, edge + size + 1, cmp );
for( int i = 1; i <= size; i++ )
{
if( getfather(edge[i].x) != getfather(edge[i].y) )
{
ans += edge[i].num;
father[getfather(edge[i].x)] = edge[i].y;
p ++;
if( p == n )
{
printf( "%d\n", ans );
break;
}
}
}
}
return 0;
}
Prims 的:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define inf 1e9
using namespace std;
int n;
int mincount[110] = {inf};
int a[110][110];
int book[110] = {0};
void prim()
{
for(int i = 1; i <= n; i++)
{
mincount[i] = a[1][i];
}
mincount[1] = 0;
int i;
for( int u = 1; u <= n; u++ )
{
int Min = inf;
for( int cas = 1; cas <= n; cas++ )
{
if( book[cas] == 0 && mincount[cas] < Min ){
Min = mincount[cas];
i = cas;
}
}
book[i] = 1;
for( int j = 1; j <= n; j++ )
{
if( book[j] == 0 && a[i][j] < mincount[j] )
{
mincount[j] = a[i][j];
}
}
}
int ans = 0;
for( int i = 1; i <= n; i++ )
{
ans += mincount[i];
}
printf( "%d", ans );
}
int main()
{
while(~scanf( "%d", &n )){
for( int i = 1; i <= n; i++ )
{
for( int j = 1; j <= n; j++ )
{
scanf( "%d", &a[i][j] );
}
}
prim();
}
return 0;
}