hdu 1301 Jungle roads

来源:互联网 发布:华硕fx50j优化 编辑:程序博客网 时间:2024/04/28 00:15

主题思想: 最小生成树,Prim 算法,或者Kruskal’s

但是我有点忘了,
Kruskal 需要记录两个节点是不是已经连通,这个可以用UF来做。
Prim 算法,需要判断两个节点是不是已经在mst中了,判断标志。
我给弄混了。

Kruskal 算法

#include <iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;struct Edge{    int w;    int v;    int cost;    Edge(){}    Edge(int from,int to ,int weight){        w=from;        v=to;        cost=weight;    }};int id[30];int Find(int p){    if( id[p]==p) return p;    id[p]=Find(id[p]);    return id[p];}void UN(int p,int q){    int pRoot=Find(p);    int qRoot=Find(q);    if(pRoot==qRoot) return ;    id[pRoot]=qRoot;}bool hasConnect(int p,int q){    return Find(p)==Find(q);}struct cmp{    bool operator ()(Edge a ,Edge b){        return a.cost>b.cost;    }};int main(){    priority_queue< Edge,vector<Edge>,cmp> q;    int n;    char from;    char to;    int weight;    int m;    while(scanf("%d",&n)!=EOF){        if(n==0)break;        //init        while(!q.empty())q.pop();        memset(id,0,sizeof(id));        for(int i=0;i<n-1;i++){            cin>>from>>m;            for(int j=0;j<m;j++){                cin>>to>>weight;                q.push(Edge(from-'A',to-'A',weight));                id[from-'A']=from-'A';                id[to-'A']=to-'A';            }        }    //prim        Edge tmp;        int sum=0;        while(!q.empty()){            tmp=q.top();            q.pop();            if(hasConnect(tmp.w,tmp.v)) continue;            UN(tmp.w,tmp.v);            sum+=tmp.cost;        }        printf("%d\n",sum);    }    return 0;}