最小生成树–prim–Constructing Roads
Description
这里有N个村庄,编号从1到N,你应该修建一些道路,这样每两个村庄就可以连接起来。我们说两个村庄A和B是相连的,当且仅当A和B之间有一条路,或者有一个C村,使得A和C之间有一条路,C和B是相连的。
我们知道,在一些村庄之间已经有一些道路,你的工作是建造一些道路,这样所有的村庄都连接在一起,所有道路的长度都是最小的。
Input
第一行是整数N(3<=N<=100),它是村庄的数目。然后出现N条线,其中的I-包含N个整数,而这些N个整数的j-是i村和j村之间的距离(距离应该是[1,1000]内的整数)。
然后有一个整数q(0<=q<=N*(N+1)/2)。然后是Q线,每一行包含两个整数a和b(1<=a<b<=N),这意味着村庄a和b村之间的道路已经建成。
Output
您应该输出一个包含整数的行,它是所有要建的道路的长度,这样所有的村庄都连接在一起,并且这个值是最小的。
Sample Input
3
0 990 692
990 0 179
692 179 0
1
1 2
Sample Output
179
prim基础题,此题有修好的路,就将其权值赋值为0
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=1e3+5;
int n,m[MAX][MAX],d[MAX];
bool f[MAX];
int prim()
{
int num=0;
memset(d,inf,sizeof(d));
memset(f,true,sizeof(f));
d[1]=0;
int v=-1;
while(true)
{
v=-1;
for(int i=1;i<=n;i++)
{
if(f[i]&&(v==-1||d[v]>d[i]))
v=i;
}
if(v==-1) break;
f[v]=false;
num+=d[v];
for(int i=1;i<=n;i++)
{
d[i]=min(d[i],m[v][i]);
}
}
return num;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&m[i][j]);
}
}
int a=0,x,y;
scanf("%d",&a);
for(int i=0;i<a;i++)
{
scanf("%d%d",&x,&y);
m[x][y]=m[y][x]=0;
}
printf("%d",prim());
return 0;
}