hdu1301 prim和kruskal求最小生成树

来源:互联网 发布:淘宝网苹果6手机价格 编辑:程序博客网 时间:2024/06/06 15:41

水题

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 0using namespace std;const int NN_MAX = 510;const int MM_MAX = 100010;const int INF = 0x1fffffff;/**********************************************************/int n,cnt;int maps[NN_MAX][NN_MAX],minCost[NN_MAX];bool vis[NN_MAX];/**********************************************************/int min_2 (int x,int y) {return x<y?x:y;}int max_2 (int x,int y) {return x>y?x:y;}void prim();/**********************************************************/int main(){    if (READ_FILE) freopen ("in.txt","r",stdin);    while(scanf("%d",&n) && n)    {        int m,k;        for(int i=0;i<=n;i++)            for(int j=i;j<=n;j++)                maps[i][j]=maps[j][i]=(i==j?0:INF);        for(int i=1;i<n;i++)        {            char tmp[2];            int x,y;            scanf("%s %d",tmp,&m);            x=tmp[0]-'A'+1;            for(int j=0;j<m;j++){                scanf("%s %d",tmp,&k);                y=tmp[0]-'A'+1;                maps[x][y]=maps[y][x]=k;            }        }        cnt=0;        prim();        printf("%d\n",cnt);    }    return 0;}void prim(){    memset(vis,0,sizeof(vis));    for(int i=0;i<=n;i++) minCost[i]=INF;//minCost是从已选的点集出发,到未选点距离最小权值    minCost[1]=0;    for(int i=1;i<=n;i++){//循环n次        int x=0;        for(int j=1;j<=n;j++)            if(!vis[j] && minCost[j]<minCost[x]) x=j;//找到未选点,且权值最小        vis[x]=1;        cnt+=minCost[x];        for(int j=1;j<=n;j++)            if(!vis[j])                minCost[j]=min_2(minCost[j],maps[x][j]);//从x出发,更新未选点的最小权值    }}

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 1using namespace std;const int NN_MAX = 510;const int MM_MAX = 100010;const int INF = 0x1fffffff;struct Edge{  int a,b,c;  Edge (int a1=0,int b1=0,int c1=0):a(a1),b(b1),c(c1){}  bool operator < (const Edge& chs)const{return c<chs.c;}}theEdge[NN_MAX*NN_MAX];/**********************************************************/int n,cnt,lenEdge;int p[NN_MAX*NN_MAX];/**********************************************************/int min_2 (int x,int y) {return x<y?x:y;}int max_2 (int x,int y) {return x>y?x:y;}int find(int i) {return i==p[i]?i:p[i]=find(p[i]);}bool merge(int i,int j){    int x=find(i),y=find(j);    if(x==y) return false;    p[x]=y;    return true;}void kruskal();/**********************************************************/int main(){    if (READ_FILE) freopen ("in.txt","r",stdin);    while(scanf("%d",&n) && n)    {        int m,k;        lenEdge=0;        for(int i=1;i<n;i++)        {            char tmp[2];            int x,y;            scanf("%s %d",tmp,&m);            x=tmp[0]-'A'+1;            for(int j=0;j<m;j++){                scanf("%s %d",tmp,&k);                y=tmp[0]-'A'+1;                theEdge[lenEdge++]=Edge(x,y,k);            }        }        cnt=0;        kruskal();        printf("%d\n",cnt);    }    return 0;}void kruskal(){    for(int i=0;i<=n;i++) p[i]=i;    sort(theEdge,theEdge+lenEdge);    for(int i=0;i<lenEdge;i++)        if(merge(theEdge[i].a,theEdge[i].b))            cnt+=theEdge[i].c;}


0 0