codevs1078 最小生成树
2017-09-15 18:58
656 查看
最小生成树裸题
#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
struct Edges{
int u,v,w;
}edges[maxn];
int n,m,fa[maxn],num[maxn];
inline bool cmp(const Edges&a,const Edges&b){
return a.w<b.w;
}
inline void init(){
for(int i=1;i<=m;++i){
fa[i]=i;
num[i]=0;
}
}
int getfa(int x){
if(x==fa[x]) return x;
else return fa[x]=getfa(fa[x]);
}
bool samefa(int x,int y){
return getfa(x)==getfa(y);
}
void uniont(int x,int y){
fa[y]=x;
num[x]+=num[y];
}
void merge(int x,int y){
int fx=getfa(x),fy=getfa(y);
if(num[fx]>num[fy]) uniont(fx,fy);
else uniont(fy,fx);
}
int main(){
read(n);
int cnt=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int x;
read(x);
if(j>i){
edges[++cnt].u=i;
edges[cnt].v=j;
edges[cnt].w=x;
}
}
m=cnt;
init();
sort(edges+1,edges+m+1,cmp);
int ans=0,tot=0;
for(int i=1;i<=cnt;++i){
if(samefa(edges[i].u,edges[i].v)) continue;
else{
ans+=edges[i].w;
++tot;
merge(edges[i].u,edges[i].v);
if(tot==n-1) break;
}
}
cout<<ans<<endl;
return 0;
}
#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
struct Edges{
int u,v,w;
}edges[maxn];
int n,m,fa[maxn],num[maxn];
inline bool cmp(const Edges&a,const Edges&b){
return a.w<b.w;
}
inline void init(){
for(int i=1;i<=m;++i){
fa[i]=i;
num[i]=0;
}
}
int getfa(int x){
if(x==fa[x]) return x;
else return fa[x]=getfa(fa[x]);
}
bool samefa(int x,int y){
return getfa(x)==getfa(y);
}
void uniont(int x,int y){
fa[y]=x;
num[x]+=num[y];
}
void merge(int x,int y){
int fx=getfa(x),fy=getfa(y);
if(num[fx]>num[fy]) uniont(fx,fy);
else uniont(fy,fx);
}
int main(){
read(n);
int cnt=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int x;
read(x);
if(j>i){
edges[++cnt].u=i;
edges[cnt].v=j;
edges[cnt].w=x;
}
}
m=cnt;
init();
sort(edges+1,edges+m+1,cmp);
int ans=0,tot=0;
for(int i=1;i<=cnt;++i){
if(samefa(edges[i].u,edges[i].v)) continue;
else{
ans+=edges[i].w;
++tot;
merge(edges[i].u,edges[i].v);
if(tot==n-1) break;
}
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- codevs 1078 最小生成树 kruskal
- 【Codevs1078】最小生成树 Prim算法(5/1000)
- code[vs]最小生成树 1078,1231
- Codevs1078 最小生成树( kruskal )
- CODEVS 1078 最小生成树
- 最小生成树 之 CODE[VS] 1078 最小生成树
- CODEVS 1078最小生成树
- 【codevs1078】最小生成树,prim算法
- codevs 1078 最小生成树
- codevs 1078 最小生成树
- codevs1078 最小生成树
- codevs1403 新三国争霸 (最小生成树+dp)
- CODEVS上关于最小生成树的一个题目
- codevs 1519 过路费(最小生成树+LCA)
- 【最小生成树】Codevs2455繁忙的都市
- codevs3287货车运输(最小生成树+LCA)
- 最小生成树 之 CODE[VS] 1231 最优布线问题
- codevs 1002 搭桥 【最小生成树】解题报告
- 【最小生成树】CODE[VS] 2627 村村通
- 【codevs2399】【BZOJ2753】滑雪与时间胶囊,bfs+最小生成树