201412-4 最优灌溉
题目
思路
最小生成树,中规中矩的prim算法,我习惯用priority_queue进行堆优化。要是第四题都这样就好了= =
AC代码如下
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1005;
const int inf=0x3fffffff;
int g[maxn][maxn],n,d[maxn];
bool vis[maxn]={false};
struct node{//入队的结点
int to,cost;
friend bool operator < (node a,node b){
return a.cost>b.cost;
}
};
int prim(){//prim算法求最小生成树
int ans=0;
fill(d,d+maxn,inf);
priority_queue<node> q;
q.push((node){1,0});
while(!q.empty()){
node now=q.top();
q.pop();
int x=now.to;
if(vis[x]) continue;
ans+=now.cost;
vis[x]=true;
for(int i=1;i<=n;i++){
if(g[x][i]!=inf&&!vis[i]&&d[i]>g[x][i]){
d[i]=g[x][i];
q.push((node){i,g[x][i]});
}
}
}
return ans;
}
int main(){
int m,a,b,c;
fill(g[0],g[maxn-1]+maxn,inf);
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
printf("%d\n",prim());
return 0;
}