题意,给了你N个农村,和每个农村之间的关系,问最小耗费。
很明显是裸的最小生成树。
下面贴上prime算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
const int maxn=1e4+10;
const int INF=1e9;
int mincost[maxn];
bool used[maxn];
int v;
typedef pair<int,int> PII;//PII.first最短距离,PII.second存当前的点
struct edge{
int to,cost;
edge(int to=0,int cost=0):to(to),cost(cost){}
};
vector<edge> g[maxn];
void init()
{
for(int i=0;i<v;i++)
{
g[i].clear();
for(int j=0;j<v;j++)
{
int x;
scanf("%d",&x);
g[i].push_back(edge(j,x));
}
}
}
int prime()
{
//优先队列加速的prime
int res=0;
for(int i=0;i<v;i++)
{
mincost[i]=INF;
used[i]=false;
}
mincost[0]=0;
priority_queue<PII,vector<PII>,greater<PII> > que;
que.push(PII(0,0));
while(!que.empty())
{
PII p=que.top();
que.pop();
int v=p.second;
if(used[v]||p.first>mincost[v]) continue;
used[v]=true;
res+=mincost[v];
for(int i=0;i<g[v].size();i++)
{
edge e=g[v][i];
if(mincost[e.to]>e.cost)
{
mincost[e.to]=e.cost;
que.push(PII(mincost[e.to],e.to));
}
}
}
return res;
}
int main()
{
while(scanf("%d",&v)!=EOF)
{
init();
int ans=prime();
printf("%d\n",ans);
}
return 0;
}