稍微改了一下的最小生成树。其实很简单,有路了就不用建造路了,直接把已经接通的公路的距离赋值为0,就好办了,接下来就是赤裸裸的prim算法。
#include<iostream>
#include<cstring>
using namespace std;
int visited[105];
int map[105][105];
int main()
{
int n,i,j,min,q,a,b,flag,sum;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>map[i][j];
for(i=1;i<=n;i++)
map[i][i]=1000000;
memset(visited,0,sizeof(visited));
cin>>q;
for(i=1;i<=q;i++)
{
cin>>a>>b;
map[a][b]=0;
map[b][a]=0;
}
visited[1]=1;
sum=0;
for(i=2;i<=n;i++)
{
min=1000000;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&map[1][j]<min)
{
flag=j;
min=map[1][j];
}
}
/*cout<<flag<<endl;*/
/*cout<<min<<endl;*/
sum=sum+min;
visited[flag]=1;
for(j=1;j<=n;j++)
if(visited[j]==0&&map[1][j]>map[flag][j])
map[1][j]=map[flag][j];
}
cout<<sum<<endl;
return 0;
}