Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 10239 | Accepted: 4010 |
Description
We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
Input
Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
Output
Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2
Sample Output
179
这是今天我写的第四个关于最小生成树的题目,只有这个题目有点变化。但是其中有一个处理,就是将已经建立的村庄的权值修改为0,但是又不与d[i][i]的0处理不一样。修改后的权值与没有修改的权值一起处理,将d[i][i]与这些分开处理。
AC程序如下:
#include<iostream>
#include<cstring>
using namespace std;
int q,n,d[101][101];
int v[101];
int main()
{
while(cin>>n)
{
int a,b,i,j,m,t,best=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>d[i][j];
cin>>q;
memset(v,0,sizeof(v));
int t1=1;
for(i=1;i<=q;i++)
{
cin>>a>>b;
d[a][b]=d[b][a]=0;
}
v[1]=1;
while(t1<n)
{
m=111111;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j) continue;
if(!v[i]&&v[j]&&d[i][j]<m)
{
m=d[i][j];
t=i;
//cout<<t<<endl;
}
}
}
//cout<<1<<endl;
v[t]=1;
best+=m;
//cout<<t<<" "<<best<<endl;
t1++;
}
cout<<best<<endl;
}
return 0;
}