图论 生成树 POJ 1251 Jungle Roads (prim)(Kruskal)

来源:互联网 发布:奥鹏网络研修总结作业 编辑:程序博客网 时间:2024/04/30 07:30
#include <iostream>#include <cstdio>#include <cstdlib>#include <string.h>using namespace std;#define N 30#define INF 99999999int mp[N][N],vis[N],dis[N];int n;int prim(){int i, j, p;    int min, res = 0;    memset(vis, 0, sizeof(vis));    vis[1] = 1;    for (i = 1; i <= n; i++)        dis[i] = mp[1][i];    for (i = 1; i < n; i++)    {        min = INF;        p = 0;        for (j = 1; j <= n; j++)            if (!vis[j] && min > dis[j])            {                min = dis[j];                p = j;            }vis[p] = 1;if(min!=INF)res += min;        for (j = 1; j <= n; j++)            if (!vis[j] && dis[j] > mp[p][j])                dis[j] = mp[p][j];    }    return res;}int main(){int m,t,i,j;char a,b;while(cin>>n,n){for(i=1;i<=n;i++){for(j=1;j<=n;j++)mp[i][j]=INF;mp[i][i]=0;}for(i=1;i<n;i++){cin>>a>>m ;for(j=1;j<=m;j++){cin>>b >>t;if(mp[a-'A'+1][b-'A'+1] > t)mp[a-'A'+1][b-'A'+1]=mp[b-'A'+1][a-'A'+1]=t;}}cout<<prim()<<endl;}return 0;}
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;struct node{int u,v,w;};node mp[5050];int st[30];int n,m,k;bool cmp(node a,node b){return a.w<b.w;}int find(int x){return x == st[x] ? st[x] :find (st[x]);}int Union(int a,int b){int x,y;x=find(a);y=find(b);if(x==y)return 1;else{st[y]=x;return 0;}}void kuska(){int i,sum=0;for(i=0; i<k ;i++){if(Union(mp[i].u,mp[i].v) == 0)sum+=mp[i].w;}cout<<sum<<endl;}int main(){int i,j,t;char char1,char2;while(cin>>n,n)//n点,m边{k=0; for(i=1;i<n;i++){cin>>char1>>m;for(j=1;j<=m;j++){cin>>char2>>t;mp[k].u = char1-'A'+1;mp[k].v = char2-'A'+1;mp[k].w = t;k++;}st[i]=i;}st[i]=i;sort(mp,mp+k,cmp);kuska();}return 0;}


0 0