Constructing Roads POJ - 2421

原oj网址点击打开链接

vj网址点击打开链接

这道题 是一个不择不扣的送分题 就是一个最小生成树 大意就是输入m个数  后面有m行 n行代表 1 -m n需要通过的数字  然后 接下来几行 代表一个双向图 (这个很重要,我们队因为这个还wa了一发)可以直接 来让他们等于0 然后输出 nn - mm的最小值    这个就很简单了 话不多说 直接上代码 

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
const int N=101;
int mapp[N][N],dis[N];
bool vis[N];
int n,q;
void prim()
{
    memset(dis,0x3f,sizeof(dis));
    memset(vis,false,sizeof(vis));
    dis[0]=0;
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int u=-1,tmp=inf;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&tmp>dis[j])
            {
                tmp=dis[j];
                u=j;
            }
        }
        vis[u]=true;
        ans+=dis[u];
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&mapp[u][j]!=inf&&mapp[u][j]<dis[j])
            {
                dis[j]=mapp[u][j];
            }
        }
    }
    printf("%d\n",ans);
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&mapp[i][j]);
        scanf("%d",&q);
        int a,b;
        for(int i=0;i<q;i++)
        {
            scanf("%d%d",&a,&b);
            mapp[a-1][b-1]=0;
            mapp[b-1][a-1]=0;
        }
        prim();
    }
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页