#include<iostream>
using namespace std;
int map[1015][1015],dis[1015],vis[1015];
int sum;
int n,q,x,y;
void prim(int k)
{
int temp;
for(int i=1;i<=n;i++)
dis[i]=map[k][i];
vis[k]=1;
for(int i=1;i<=n;i++)
{
int cf=0x7FFFFFFF;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]<cf)
{
temp=j;
cf=dis[j];
}
if(cf==0x7FFFFFFF)
cf=0;
sum+=cf;
vis[temp]=true;
for(int j=1;j<=n;j++)
if(!vis[j]&&map[temp][j]<dis[j])
dis[j]=map[temp][j];
}
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
}
}
cin>>q;
while(q--)
{
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=0;//这个是双向的,注意!!!
}
sum=0;
memset(vis,0,sizeof(vis));
prim(1);
cout<<sum<<endl;
}
return 0;
}
poj 2421 Constructing Roads prim最小生成树 基础!!!
最新推荐文章于 2020-06-02 10:49:09 发布