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;}

原创粉丝点击