POJ 2421 Constructing Roads(简单最小生成树模板题)

给你n个点,然后求最小生成树。特殊之处在于有q个点之间已经连上了边

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=505;

int lowc[505];
bool vis[505];
int cost[maxn][maxn];
int n;

int prim(int cost[][maxn],int n)//编号从1-n
{
    int i,j,p;
    int minc,res=0;
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    for(i=1;i<=n;i++)
       lowc[i]=cost[1][i];
    for(i=1;i<n;i++)
    {
        minc=INF;
        p=-1;
        for(j=1;j<=n;j++)
            if(vis[j]==0&&minc>lowc[j])
            {minc=lowc[j];p=j;}
        if(minc==INF)return -1;
        res+=minc;vis[p]=1;
        for(j=1;j<=n;j++)
           if(vis[j]==0&&lowc[j]>cost[p][j])
             lowc[j]=cost[p][j];
    }
    return res;
}


int main()
{
    int n,q;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>cost[i][j];
            }
        }
        cin>>q;
        int a,b;
        for(int i=0;i<q;i++)
        {
            cin>>a>>b;
            cost[a][b]=0;
            cost[b][a]=0;
        }
        cout<<prim(cost,n)<<endl;

    }

    

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Fy1999/p/9445742.html