以poj1258为例
题意简述:在n个城市之间铺设光缆,铺设光缆费用很高且各个城市之间铺设光缆的费用不同。设计目标是使这n个城市之间的任意两个城市之间都可以直接或间接通信,并且要使铺设光缆的费用最低。
解题代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 10005
#define inf 100010
int a[N][N],ans;
bool vis[N];
int dis[N],n;
bool prim()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
dis[i]=inf;
}
ans=0;dis[1]=0;
for(int i=0;i<=n;i++)
{
int tmp=inf,k=0;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<tmp)
{
tmp=dis[j];
k=j;
}
}
if(tmp==inf)
{
return false;
}
vis[k]=true;
ans += tmp;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>a[k][j])
{
dis[j] = a[k][j];
}
}
}
return true;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
prim();
cout<<ans<<endl;
}
return 0;
}