poj2421 Constructing Roads

来源:互联网 发布:最简单的网络贷款平台 编辑:程序博客网 时间:2024/06/05 01:07

题目链接:http://poj.org/problem?id=2421
题意:给你一个邻接矩阵并且还告诉你已经有一些边相连了,让你求最小生成树
解析:已经相连的边赋值为0,然后直接做最小生成树

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int maxn = 1e5+100;struct node{    int u,v,c;    node () {}    node (int _u,int _v,int _c)    {        u = _u;        v = _v;        c = _c;    }    bool operator < (const node &b)const    {        return c<b.c;    }}a[maxn];int tmp[105][105];int fa[105];int getfa(int x){    if(x==fa[x])        return fa[x];    return fa[x] = getfa(fa[x]);}int main(void){    int n,m;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        fa[i] = i;        for(int j=1;j<=n;j++)            scanf("%d",&tmp[i][j]);    }    scanf("%d",&m);    while(m--)    {        int x,y;        scanf("%d %d",&x,&y);        tmp[x][y] = 0;    }    int cnt = 0,ans = 0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++)            a[cnt++] = node(i,j,tmp[i][j]);    }    sort(a,a+cnt);    for(int i=0;i<cnt;i++)    {        int t1 = getfa(a[i].u);        int t2 = getfa(a[i].v);        if(t1!=t2)        {            fa[t1] = t2;            ans += a[i].c;        }    }    printf("%d\n",ans);    return 0;}
原创粉丝点击