/*蛮简单的题目。prim算法用最小优先队列进行优化即可*/
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
#define N 1001
#define infinite 0X7fffffff
#define pli pair<int,int>
using namespace std;
int myEdge[N][N];
int farms,flag[N],dist[N];
int sum=0;
void Prim()
{
priority_queue<pli,vector<pli>,greater<pli> > q;
memset(flag,0,sizeof(flag));
for (int j=1;j<=farms;++j)
dist[j]=infinite;
dist[1]=0;
q.push(make_pair(0,1));
while (!q.empty())
{
pli temp=q.top();
q.pop();
if(flag[temp.second]) continue;
int minIndex=temp.second;
int minLength=temp.first;
flag[minIndex]=1;
sum+=minLength;
for (int k=1;k<=farms;k++)
{
if(!flag[k]&&myEdge[minIndex][k]!=0&&myEdge[minIndex][k]<dist[k])
{
dist[k]=myEdge[minIndex][k];
q.push(make_pair(dist[k],k));
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while (cin >>farms)
{
sum=0;
for (int j=1;j<=farms;j++)
{
for (int k=1;k<=farms;k++)
scanf("%d",&myEdge[j][k]);
}
Prim();
cout << sum << endl;
}
}
poj1258
最新推荐文章于 2015-07-15 20:24:52 发布