Constructing Roads POJ - 2421 最小生成树板子题

#include<iostream>
#include<cstring> 
#include<algorithm>
using namespace std;
const int N=110;
int p[N];
struct edge{
    int a;
    int b;
    int w;
}e[N*N];
int map[N][N],flag[N][N],num,n;
bool cmp(edge a,edge b)
{
    return a.w<b.w;
}
int find(int x)
{
    if(p[x]!=x)
        p[x]=find(p[x]);
    return p[x];
}
int main()
{
    while(cin>>n&&n)
    {
        memset(flag,0,sizeof flag);
        memset(map,0,sizeof map);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                cin>>map[i][j];
        int m,x,y;
        cin>>m;
        while(m--)
        {
            cin>>x>>y;
            flag[x][y]=1;
        }
        num=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                if(flag[i][j])
                {
                    e[num].a=i;
                    e[num].b=j;
                    e[num++].w=0;
                }
                else
                {
                    e[num].a=i;
                    e[num].b=j;
                    e[num++].w=map[i][j];
                }
        sort(e,e+num,cmp);
        for(int i=1;i<=n;i++)
            p[i]=i;
        int sum=0;
        for(int i=0;i<num;i++)
        {
            int a=find(e[i].a);
            int b=find(e[i].b);
            int w=e[i].w;
            if(a!=b)
            {
                p[a]=b;
                sum+=w;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

 

posted @ 2020-01-29 13:14  晴屿  阅读(102)  评论(0编辑  收藏  举报