hdu 1233 kruskal+优先队列 如果让我说:我只能说,实力决定一切。

来源:互联网 发布:视频后期软件免费 编辑:程序博客网 时间:2024/04/30 14:12
#include<iostream>#include<algorithm>#include<cstdio>#include<stack>#include<queue>#include<string.h>using namespace std;int N,M;struct node{    int st,ed,w;    bool friend operator <(const node &a,const node &b)    {        return a.w>b.w;    }};priority_queue<node>S;int far[111];int rank[111];void init(){    for(int i=0; i<=N; i++)    {        far[i]=i;        rank[i]=1;    }}int find_set(int x){    if(far[x]==x)        return x;    far[x]=find_set(far[x]);    return far[x];}int kruskal(){    node tem;    int gh=0;    int sum=0;    while(!S.empty())    {        tem=S.top();        S.pop();        int x=find_set(tem.st);        int y=find_set(tem.ed);        if(x!=y)        {            if(rank[x]>rank[y])            {                rank[x]+=rank[y];                far[y]=x;            }            else            {                rank[y]+=rank[x];                far[x]=y;            }            sum+=tem.w;            gh++;            if(gh==N)                break;        }    }    return sum;}int main(){    node Node;    while(scanf("%d",&N),N)    {        init();        while(!S.empty())          S.pop();        M=(N)*(N-1)/2;        for(int i=0; i<M; i++)        {            scanf("%d%d%d",&Node.st,&Node.ed,&Node.w);            S.push(Node);        }       printf("%d\n",kruskal());    }    return 0;}


 

 

 

 

 

 

#include<iostream>#include<string.h>#include<algorithm>#include<cstdio>#include<vector>#include<queue>#define inf 1<<30#define MAX 5000using namespace std;int vis[MAX];int dis[MAX];int N,M;int gra[MAX][MAX];int prime(int pox){    int index;    int sum=0;    int k;    memset(vis,0,sizeof(vis));    vis[pox]=1;    for(int i=1; i<=N; i++)    {        dis[i]=gra[pox][i];    }    for(int i=1; i<N; i++)    {        int mincost=inf;        for(int j=1; j<=N; j++)        {            if(!vis[j]&&dis[j]<mincost)            {                mincost=dis[j];                k=j;            }        }        sum+=mincost;        vis[k]=1;        for(int j=1; j<=N; j++)            if(!vis[j]&&dis[j]>gra[k][j])            {                dis[j]=gra[k][j];            }    }    return sum;}int main(){    int a,b,c;    while(scanf("%d",&N),N)    {        for(int i=1;i<=N;i++)         for(int j=1;j<=N;j++)            gra[i][j]=inf;        M=N*(N-1)/2;        for(int i=1; i<=M; i++)        {            scanf("%d%d%d",&a,&b,&c);            gra[a][b]=gra[b][a]=c;        }        printf("%d\n",prime(1));    }    return 0;}


 

 

原创粉丝点击