原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();
}
}