http://acm.pku.edu.cn/JudgeOnline/problem?id=2421
题意:在几个村庄之间修路,使得所花费的费用最少。
最小生成树。
#include <cstdio>
#include <iostream>
using namespace std;
int map[101][101];
bool intree[101];
int dis[101];
int number;
void Read()
{
int i,j;
int q,x,y;
for(i = 1;i <= number;i ++)
for(j = 1;j <= number;j ++)
scanf("%d",&map[i][j]);//输入每个村庄之间路程长度
scanf("%d",&q);//输入有几个村庄已经修好了路
for(i = 0;i < q;i ++)
{
//修好了路的村庄之间路程置为0
scanf("%d%d",&x,&y);
map[x][y] = 0;
map[y][x] = 0;
}
//初始化路程数组和标记数组
for(i = 1;i <= number;i ++)
{
dis[i] = 99999999;
intree[i] = false;
}
intree[1] = true;
for(i = 1;i <= number;i ++)
dis[i] = map[1][i];
}
void Prim()
{
int i,j,loc;
int min,total = 0;
for(i = 1;i < number;i ++)
{
min = 99999999;
for(j = 1;j <= number;j ++)
{
if(intree[j] == false && min > dis[j])//寻找最小边
{
min = dis[j];
loc = j;
}
}
total += min;//总数加上最短边
intree[loc] = true;//标记变为真
for(j = 1;j <= number;j ++)
{
if(intree[j] == false)
{
if(dis[j] > map[loc][j])
dis[j] = map[loc][j];
}
}
}
printf("%d/n",total);
}
int main()
{
while(scanf("%d",&number) != EOF)
{
Read();
Prim();
}
return 0 ;
}
/*
3 0 990 692 990 0 179 692 179 0 1 1 2
179
*/