题目:http://acm.hdu.edu.cn/showproblem.php?pid=1102
分析:看到这题给出的都是矩阵形式,就知道了可以用Prim算法求MST。
#include <iostream> using namespace std;
#define typec int
#define V 101
const typec inf=0x3f3f3f3f;
int vis[V];
typec lowc[V],cost[V][V];
/*=================================================*\
| Prim求MST
| INIT: cost[][]耗费矩阵(inf为无穷大);
| CALL: prim(cost, n); 返回-1代表原图不连通;
\*==================================================*/
typec prim(int n)
{
int i,j,p;
typec minc,res=;
memset(vis,,sizeof(vis));
vis[]=;
for(i=; i<n; i++) lowc[i]=cost[][i];
for(i=; i<n; i++)
{
minc=inf;
p=-;
for(j=; j<n; j++)
{
if(==vis[j]&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
}
if(inf==minc) return -;
res+=minc;
vis[p]=;
for(j=; j<n; j++)
if(==vis[j]&&lowc[j]>cost[p][j])lowc[j]=cost[p][j];
}
return res;
} int main()
{
// freopen("input.txt","r",stdin);
int n,m,i,j,u,v;
while(cin>>n&&n!=)
{
memset(cost,inf,sizeof(cost));
for(i=; i<n; i++)
for(j=; j<n; j++)
cin>>cost[i][j];
cin>>m;
for(i=; i<m; i++)
{
cin>>u>>v;
cost[u-][v-]=cost[v-][u-]=;
}
cout << prim(n) << endl;
}
return ;
}