poj2421

题意:就是给了N个村庄,然后给你权值什么的 ,后面又给了一个数M,告诉你哪些路已经修好了,你就不用修了,最后问最小生成树,问需要修的最短的路。

思路:把已经修建好的路的权值设置为0,这样就加不进去了,剩下的套模板就好


#include<cstdio>

#include<cstring>

#include<cmath>

#include<vector>

#include<queue>

#include<iostream>

#include<algorithm>

#define maxn 1020

#define INF 0x3f3f3f3f


using namespace std;


int map[maxn][maxn];

int d[maxn];

bool vis[maxn];

int n,q;

void prim()

{

    for(int i = 1; i <= n; i ++)

    {

        d[i] = map[1][i];

        vis[i] = 0;

    }

    for(int i = 1; i <= n; i ++)

    {

         int minx = INF;

         int now;

        for(int j = 1; j <= n; j ++)

        {

            if(!vis[j] && minx > d[j])

            {

                now = j;

                minx = d[j];

            }

        }

        vis[now] = 1;

        for(int k = 1; k <= n; k ++)

        {

            if(!vis[k] && d[k] > map[now][k])

                d[k] = map[now][k];

        }

    }

    int sum = 0;

    for(int i = 1; i <= n; i ++)

        sum += d[i];

    printf("%d\n",sum);

}


int main()

{

    scanf("%d",&n);

    for(int i = 1; i <= n; i ++)

        for(int j = 1; j <= n; j ++)

    {

        scanf("%d",&map[i][j]);

        //map[i][j] = map[j][i];

    }

    scanf("%d",&q);

    int x,y;

    while(q --)

    {

        scanf("%d%d",&x,&y);

        map[x][y] = map[y][x] = 0;

    }

    prim();


    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值