最小生成树
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
在一个无向图中,求最小生成树。
Input
多组测试数据,对于每组测试数据,第1行输入正整数n(1 <= n <= 1000)、m,表示n个顶点(编号从1开始)和m条边。之后m行每行输入u(1 <= u <= n)、v(1 <= v <= n)、w(1 <= w <= 100),表示在顶点u和顶点v之间存在无向边,且权值为w。
Output
对于每组测试数据,若存在最小生成树则输出最小生成树的权值和,若不存在最小生成树则输出-1。
Sample Input
3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32
Sample Output
16
Hint
Source
xry-fhf
#include<iostream> #include<memory.h> #define MAX 0x3f3f3f3f #define N 1100 using namespace std; int low[N],map[N][N],visit[N]; int n; int prim()//普里姆算法 { int i,j,pos,min,result=0; memset(visit,0,sizeof(visit)); visit[1]=1; pos=1; for(i=1;i<=n;i++) if(i!=pos) low[i]=map[pos][i]; for(i=1;i<n;i++) { min=MAX; for(j=1;j<=n;j++) { if(visit[j]==0 && min>low[j]) { min=low[j]; pos=j; } } if(MAX==min) { return -1; } result+=min; visit[pos]=1; for(j=1;j<=n;j++) { if(visit[j]==0 && low[j]>map[pos][j]) low[j]=map[pos][j]; } } return result; } int main() { int m,a,b,c,k,i; while(cin>>n>>m && n) { memset(map,MAX,sizeof(map)); for(i=1;i<=m;i++) { cin>>a>>b>>c; if(map[a][b]>c)//居然还有相同边....醉了... { map[a][b]=map[b][a]=c; } } k=prim(); cout<<k<<endl; } return 0; }