POJ 1258 Agri-Net (prim + kruskal)

最小生成树水题,不解释。两种方法,没有用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; }

你可能感兴趣的:(POJ 1258 Agri-Net (prim + kruskal))