最小生成树
分别用prime和kruskal算法实现。
prime算法判断是否连通是查看是否加入了n-1条边(即循环是否执行了n-1次)
kruskal算法判断是否连通是 最后查看是否所有点都在同一集合内
prime算法:
#include <iostream> #include <memory.h> using namespace std; const int IN = (1<<28); int G[55][55]; int locost[55]; int N,M,Cost,flag; void prime() { locost[1] = 0; for( int i = 1; i <= N; i++ ) { locost[i] = G[1][i]; } for( int u = 1; u < N; u++ ) { int MinV = 0, Min = IN; for( int i = 1; i <= N; i++ ) { if( locost[i] && locost[i] < Min ) { MinV = i; Min = locost[i]; } } if( !MinV ) { flag = 0; break; } else { Cost += locost[MinV]; locost[MinV] = 0; for( int i = 1; i <= N; i++ ) { if( locost[i] && locost[i] > G[MinV][i] ) { locost[i] = G[MinV][i]; } } } } } int main() { while( cin >> N, N ) { cin >> M; memset(G, 0, sizeof(G)); memset(locost, 0, sizeof(locost)); for( int i = 1; i <= N; i++ ) for( int j = 1; j <= N; j++ ) { if( i==j ) G[i][j] = 0; else G[i][j] = IN; } while( M-- ) { int Begin,End,Len; cin >> Begin >> End >> Len; if( Len < G[Begin][End] ) { G[Begin][End] = Len; G[End][Begin] = Len; } } Cost = 0; flag = 1; prime(); if( flag ) cout << Cost << endl; else cout << 0 << endl; } return 0; }
kruskal算法:
#include <iostream> #include <queue> #include <memory.h> using namespace std; struct Edage { int sou,des,length; Edage( int ss = 0, int dd = 0, int ll = 0 ):sou(ss),des(dd),length(ll) {} friend bool operator <( const Edage &a, const Edage &b ) { return a.length > b.length; } }; priority_queue <Edage> Edages; int id[55]; int N,M,Cost; void init_union() { for( int i = 1; i <= N; i++ ) { id[i] = i; } } int Find( int p ) { return id[p]; } int Isconnect( int p, int q ) { int pid = id[p]; int qid = id[q]; if( pid == qid ) return 1; else return 0; } void unit( int p, int q ) { int pid = id[p]; int qid = id[q]; if( pid == qid ) return; else { for( int i = 1; i <= N; i++ ) { if( id[i] == qid ) { id[i] = pid; } } } } void kruskal() { init_union(); int cnt = 0; while( !Edages.empty() && cnt != N-1 ) { Edage now = Edages.top(); Edages.pop(); int p = now.sou; int q = now.des; if( !Isconnect( p, q ) ) { Cost += now.length; cnt++; unit( p, q ); } } } bool Judge() { int ID = id[1]; for( int i = 1; i <= N; i++ ) if( id[i] != ID ) return false; return true; } int main() { while( cin >> N, N != 0 ) { cin >> M; while( !Edages.empty() ) { Edages.pop(); } memset(id, 0, sizeof(id)); while( M-- ) { int Begin,End,Len; cin >> Begin >> End >> Len; Edages.push( Edage( Begin, End, Len) ); } Cost = 0; kruskal(); if( Judge() ) cout << Cost << endl; else cout << 0 << endl; } return 0; }