您的位置:首页 > 其它

POJ 1258 Agri-Net (prim + kruskal)

2010-09-04 21:22 447 查看
最小生成树水题,不解释。两种方法,没有用priority queue优化。

PRIM:

#include<iostream>
const int INF = 99999999;
using namespace std;
int main(void)
{
int map[101][101];
int dist[101],flag[101];
int n,i,j;
int now,min,sum;
while( cin >> n)
{
for( i = 1;i <= n;i++)
{
dist[i] = INF;
flag[i] = 0;
for( j = 1; j <= n; j++ )
cin >> map[i][j];
}
sum = 0;
dist[1] = 0;
flag[now=1] = 1;
for( i = 1; i < n; i++ )
{
for( j = 1; j <= n; j++ )
if( !flag[j] && map[now][j] < dist[j] )
dist[j] = map[now][j];
for( j = 1,min = INF; j <= n; j++ )
if( !flag[j] && dist[j] < min)
min = dist[ now = j ];
flag[now] = 1;
sum += min;
}
cout << sum << endl;
}
return 0;
}


KRUSKAL:

#include<iostream>
#include<algorithm>
const int INF = 99999999;
using namespace std;
struct node
{
int from,to,w;
} edge[10001],t;
int p[101];
int find(int x)
{return p[x]==x?x:p[x]=find(p[x]);}
int cmp(const node a,const node b)
{return a.w<b.w;}
int main(void)
{
int map[101][101];
int dist[101],flag[101];
int n,i,j,from,to;
int now,min,sum,count;
while( cin >> n)
{
for( i = 1,count = 0; i <= n; i++ )
for( j = 1; j <= n; j++ )
{
count++;
edge[count].from = i;
edge[count].to = j;
cin >> edge[count].w;
}
sort(edge+1,edge+count+1,cmp);
sum = 0;
for( i = 1; i <= n; i++ ) p[i] = i;
for( i = 1,min=0; i <= count; i++ )
{
from = edge[i].from;
to = edge[i].to;
from = find(from);
to = find(to);
if( from == to ) continue;
sum += edge[i].w;
p[from] = to;
++min;
if( min == n-1) break;
}
cout << sum << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: