hdu 1102 Constructing Roads 最小生成树Kruskal

来源:互联网 发布:明教 捏脸数据 编辑:程序博客网 时间:2024/05/16 17:30

这原本是最小生成树prim部分的题,但感觉kruskal好用,就用kruskal 打了

这道题题意有点变扭,修路,使所有村庄连通,使修路的街道总长度最小;原本还以为使街道的总长度最小,但案例过不了才发觉

使已经修了的路的权值为0,其他路的权值当然为路的长度,模板题

代码:

#include<iostream>#include<algorithm>#include<cstring>using namespace std;int n;const int maxn=10010;int a[maxn][maxn];int fa[maxn];struct Node{    int u;    int v;    int weight;};Node b[maxn];bool cmp(Node x,Node y){    return x.weight<y.weight;}void init(){    int i;    for(i=1;i<=n;i++)    {        fa[i]=i;    }}int find(int u){    return u==fa[u]?fa[u]:fa[u]=find(fa[u]);}void join(int u,int v){    fa[find(u)]=find(v);}int main(){    while(scanf("%d",&n)!=EOF)    {        int i,j;        init();        int start=0;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)                scanf("%d",&a[i][j]);        }        int q;        scanf("%d",&q);        int u,v;         while(q--)        {            scanf("%d%d",&u,&v);            a[u][v]=0;            a[v][u]=0;        }         for(i=1;i<=n;i++)        {            for(j=1;j<i;j++)            {                b[start].u=i;                b[start].v=j;                b[start++].weight=a[i][j];            }        }        sort(b,b+start,cmp);        int cnt=0;        int ans=0;        for(i=0;i<start;i++)        {           int u=b[i].u;           int v=b[i].v;           if(find(u)!=find(v))           {               ans+=b[i].weight;               join(u,v);               cnt++;           }           if(cnt==n-1)            break;        }        printf("%d\n",ans);    }    return 0;}



0 0
原创粉丝点击