http://acm.hdu.edu.cn/showproblem.php?pid=1102
#include<iostream>
#include<cstdio>
using namespace std;
const int N=110;
const int MaxDist=INT_MAX;
int mat[N][N],dist[N],n;
bool visit[N];
void prim()
{
int i,j,sum=0,carry1,carry2=0;
for(i=0;i<n;i++)
{
dist[i]=mat[i][0];
visit[i]=false;
}
visit[0]=true;
for(i=0;i<n;i++)
{
carry1=MaxDist;
for(j=0;j<n;j++)
{
if(carry1>dist[j]&&visit[j]==false)
{
carry1=dist[j];
carry2=j;
}
}
if(carry1==MaxDist)break;
visit[carry2]=true;
sum+=carry1;
for(j=0;j<n;j++)
{
if(dist[j]>mat[carry2][j]&&visit[j]==false)
{
dist[j]=mat[carry2][j];
}
}
}
cout<<sum<<endl;
}
int main()
{
int a,b,i,j,m;
while(cin>>n)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>mat[i][j];
}
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>a>>b;
a--;
b--;
mat[a][b]=mat[b][a]=0;
}
prim();
}
return 0;
}