POJ 1251

来源:互联网 发布:centos 查看软件版本 编辑:程序博客网 时间:2024/04/30 14:24

题意:给出一个n,以邻接表的形式给出n个点与其他点相连的距离,求最小生成树

思路:prim + 优先队列

#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#include<ctype.h>#include<queue>using namespace std;const int qq=1000+5;int head[qq];int vis[30];int tot,n;struct Edge{int to,w,next;bool operator < (const Edge a)const{return w>a.w;}}edge[qq*2];void Add(int u,int v,int w){edge[tot].to=v;edge[tot].w=w;edge[tot].next=head[u];head[u]=tot++;}void Prim(){priority_queue<Edge>Q;int minx=0;Edge now,cur;now.w=0;now.to=1;Q.push(now);while(!Q.empty()){now=Q.top();Q.pop();int to=now.to;if(vis[to])continue;int w=now.w;minx+=w;vis[to]=1;for(int i=head[to]; i!=-1; i=edge[i].next){if(!vis[edge[i].to])Q.push(edge[i]);}}printf("%d\n",minx);}int main(){while(scanf("%d",&n)!=EOF){if(n==0)break;n--;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));char s[5];int m;for(int i=0; i<n; ++i){scanf("%s%d",s,&m);int x=s[0]-'A'+1,y,w;for(int j=0; j<m; ++j){scanf("%s%d",s,&w);y=s[0]-'A'+1;Add(x,y,w);Add(y,x,w);}}Prim();}return 0;}


0 0
原创粉丝点击