POJ-2421 Constructing Roads(最小生成树)

题目传送门:(POJ-2421 Constructing Roads)

题目大意:

要修公路,输入一个n,表示n个村庄。接着输入n*n的矩阵,该图的邻接矩阵,然后输入一个q 接下来的q行

每行包含两个数a,b,表示a、b这条边联通,就是已经有公路不用修了,要让所有村庄联通在一起问:修路最小代价?

分析:

根据题目输入构造邻接矩阵,然后把已经联通的村庄的距离设置为0,表示不用在修这条公路。在用新的邻接矩阵跑prim就可以了

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX=150;
int n,map[MAX][MAX],q;
int dist[MAX];
bool vis[MAX];
struct rood{
    int st,en;
}ro[MAX*(MAX+1)+10];
int prim()
{
    for(int i=0;i<=n;i++)
    {
        dist[i]=INF;
        vis[i]=false;
    }
    dist[1]=0;
    int min,pos,ans=0;
    for(int i=1;i<=n;i++)
    {
        min=INF;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&min>dist[j])
            {
                min=dist[j];
                pos=j;
            }
        }
        vis[pos]=true;
        ans+=min; 
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dist[j]>map[pos][j])
            {
                dist[j]=map[pos][j];
            }
        }
    }
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&map[i][j]);
            
    scanf("%d",&q);
    for(int i=0;i<q;i++)
    {
        scanf("%d%d",&ro[i].st,&ro[i].en);
        map[ro[i].st][ro[i].en]=map[ro[i].en][ro[i].st]=0;
    }
            
    int ans=prim();
    printf("%d\n",ans);
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/LjwCarrot/p/9492237.html