poj 2377Bad Cowtractors

来源:互联网 发布:网络电视怎么看电视台 编辑:程序博客网 时间:2024/05/31 18:39
#include<stdio.h>#include<string.h>const int INF = 0x3f3f3f3f;const int maxn = 1e3;int mp[maxn][maxn];  // 存图; int vis[maxn];  //是否在新图内; int dis[maxn];  //第i个顶点到新图最短距离; int prim(int n);int n,m;int main (){int cun1,cun2,cost,ans = 0;while (scanf("%d%d", &n, & m) != EOF && n != 0){memset(mp,0,sizeof(mp));for (int i = 0; i < m; i++){scanf("%d%d%d", &cun1,&cun2,&cost);cun1--;cun2--;if(cost > mp[cun1][cun2]) {mp[cun1][cun2] = cost;mp[cun2][cun1] = cost;}}ans = prim(n);printf("%d\n",ans);}}int prim(int n){int ans = 0;memset(vis,0,sizeof(vis));vis[0] = 1;   //注意第一个点的初始化; for (int i = 0; i < n; i++)dis[i] = mp[0][i]; // 新图第一个点为0,初始化dis; for (int i = 1; i < n; i++){  // 加入第i+1个点 int minn = 0 ;  // 旧图到新图最短距离 int pos = -1;    // 旧图最近点标号; for (int j = 0; j < n; j++){if(!vis[j] && minn < dis[j]) {minn = dis[j];pos = j;}}if (minn == 0) return -1;ans += minn;     //更新答案; vis[pos] = 1;for (int j = 0; j < n; j++) {if (!vis[j] && mp[pos][j] > dis[j]){dis[j] = mp[pos][j];}}}return ans;}