标签:
#include<bits/stdc++.h> //该头文件包含C++所有头文件(编程中显得非常方便,很省时间)
//#include <vector> //若无以上头文件,则需要添加下面这两个头文件才不会报错
//#include <iostream>
using namespace std;
const int maxn=1007;
const int inf=10001;
int n,m; struct node {
int to,cost;
};
bool vis[maxn];
int d[maxn];
vector<node> G[maxn];
void init() {
for(int i=0;i<maxn;i++) {
G[i].clear();
}
}
//最小生成数prim,CCF中可以直接调用
int prim() {
int ans=0;
for(int i=1;i<maxn;i++) {
d[i]=inf;
vis[i]=0;
}
d[1]=0;
while(1){
int v=-1;
for(int i=1;i<=n;i++) {
if(!vis[i]&&(v==-1||d[i]<d[v])) v=i;
}
if(v==-1) break;
vis[v]=1;
ans+=d[v];
for(int i=0;i<G[v].size();i++) {
if(vis[G[v][i].to]) continue;
d[G[v][i].to]=min(d[G[v][i].to],G[v][i].cost);
}
}
return ans;
}
int main() {
int a,b,c; node n1;
while(cin>>n>>m){
init();
for(int i=0;i<m;i++) {
cin>>a>>b>>c;
n1.to=b;n1.cost=c;
G[a].push_back(n1);
n1.to=a;
G[b].push_back(n1);
}
int ans=prim();
cout<<ans<<endl;
//用于检测每个节点的邻接节点以及权值是否正确
/*for(int i=1;i<=n;i++) {
for(int j=0;j<G[i].size();j++)
cout<<G[i][j].to<<" "<<G[i][j].cost<<endl;
}*/ }
}
若CCF中再次考到最小生成树,但是输入方式为:
第一行为:给定n个点,表示当前有多少块麦田
接下来n行表示:
每块麦田之间是否相连接以及相应的权值
如该题输入方式可改为:
4
0 1 0 0
1 0 4 2
0 4 0 3
0 2 3 0
//用于检测每个节点的邻接节点以及权值是否正确
/*for(int i=1;i<=n;i++) {
for(int j=0;j<G[i].size();j++)
cout<<G[i][j].to<<" "<<G[i][j].cost<<endl;
}*/ }
标签:
原文地址:http://www.cnblogs.com/lchzls/p/5030814.html