POJ 1251 kruskal+优先队列+并查集
来源:互联网 发布:东软医疗软件下载 编辑:程序博客网 时间:2024/06/10 02:47
//将scanf改成cin就ac了 //使用的是kruskal+优先队列 #include<stdio.h>#include<stdlib.h>#include<queue>#include<algorithm>#include<iostream>using namespace std;struct Edge{ int from,to,w; Edge(int x,int y,int z):from(x),to(y),w(z){} bool operator<(const Edge &rhs) const { return w>rhs.w; }};int n;int parent[27];priority_queue<Edge> q;void make_set(int x){ parent[x]=x;}int findset(int x){ return parent[x]!=x?parent[x]=findset(parent[x]):x;}void unionset(int x,int y){ if(x<y) parent[y]=x; else parent[x]=y;}int kruskal(){ int res=0; for(int i=0;i<n;i++) make_set(i); while(!q.empty()){ Edge tmp=q.top();q.pop(); int x=findset(tmp.from); int y=findset(tmp.to); if(x!=y){ res+=tmp.w; unionset(x,y); } } return res;}int main(){ while(cin>>n){ if(n==0) break; while(!q.empty()) q.pop(); char a,b; int k,ww; getchar(); for(int i=0;i<n-1;i++){ cin>>a>>k; for(int j=0;j<k;j++){ cin>>b>>ww; q.push(Edge(a-'A',b-'A',ww)); } } printf("%d\n",kruskal()); } return 0;}