codevs 1231 最优布线问题

来源:互联网 发布:nginx 时间函数 编辑:程序博客网 时间:2024/04/30 07:55
//prim#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int M=100000+50;vector<int> tu[M],cost[M];int n,m,used[M],x,y,z;long long ans;priority_queue<pair<int,int> ,vector< pair<int,int> >,greater<pair<int,int> > >  Q;void build(int f,int t,int v){    tu[f].push_back(t);    cost[f].push_back(v);    return ;}void prim(int x){    used[x]=1;    for(int i=0;i<tu[x].size();i++){        if(used[tu[x][i]]==0)        Q.push(make_pair(cost[x][i],tu[x][i]));    }    while(!Q.empty()){        pair<int,int> u=Q.top();        Q.pop();        if(used[u.second]==1) continue;        int v=u.second;        used[v]=1;        ans+=u.first;        for(int i=0;i<tu[v].size();i++){            if(used[tu[v][i]]==0)            Q.push(make_pair(cost[v][i],tu[v][i]));        }    }}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%d%d%d",&x,&y,&z);        build(x,y,z);        build(y,x,z);    }    prim(1);    printf("%lld",ans);    return 0;}
//kruskal#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=100000+50;struct node{    long long  f,t,v;}m[N];long long fa[N];long long  n,z,ins,p;long long ans;bool cmp(node a,node b){    return a.v<b.v;}int find(long long  x){    if(fa[x]==x) return x;    else return fa[x]=find(fa[x]);}void init(){    for(int i=1;i<=n;i++) fa[i]=i;}int main(){    scanf("%lld%lld",&n,&p);    init();    for(int i=1;i<=p;i++){        scanf("%lld%lld%lld",&m[i].f,&m[i].t,&m[i].v);    }    sort(m+1,m+p+1,cmp);    for(int i=1;i<=p;i++){        long long x=m[i].f;long long y=m[i].t;        fa[x]=find(fa[x]);fa[y]=find(fa[y]);        if(fa[x]!=fa[y]){            fa[fa[x]]=fa[y];            ans+=m[i].v;            ins++;            if(ins==n-1) {                printf("%lld",ans);                return 0;            }        }    }}