题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz
输入输出格式
输入格式:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
输入输出样例
输入样例#1: 复制
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
输出样例#1: 复制
7
说明
时空限制:1000ms,128M
数据规模:
对于20%的数据:N<=5,M<=20
对于40%的数据:N<=50,M<=2500
对于70%的数据:N<=500,M<=10000
对于100%的数据:N<=5000,M<=200000
样例解释:

所以最小生成树的总边权为2+2+3=7
用namespace 装波B(别打我)
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int read()
{
int ret=0; char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
ret=(ret<<1)+(ret<<3)+ch-'0',ch=getchar();
return ret;
}
const int N=1e6+5;
int n,m;
namespace kru
{
int ff[N],ans=0;
struct A{
int u,v,w;
}e[N];
bool cmp(A i,A j)
{
return i.w<j.w;
}
int find(int u)
{
return u==ff[u]?u:ff[u]=find(ff[u]);
}
void main()
{
for(int i=1;i<=m;i++)
e[i]=(A){read(),read(),read()};
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++) ff[i]=i;
int tot=0;
for(int i=1;i<=m;i++)
{
int f1=find(e[i].u),f2=find(e[i].v);
if(f1!=f2)
{
ff[f1]=f2,tot++;
ans+=e[i].w;
if(tot==n-1) break;
}
}
if(tot!=n-1) printf("orz\n");
else printf("%d\n",ans);
}
}
namespace prim
{
int cnt,to[N],nxt[N],w[N],he[N];
int d[N],fl[N],ans=0;
struct A{
int id,x;
};
bool operator >(A i,A j)
{
return i.x>j.x;
}
priority_queue<A,vector<A>,greater<A> >q;
inline void add(int u,int v,int k)
{
to[++cnt]=v,nxt[cnt]=he[u],he[u]=cnt,w[cnt]=k;
}
void main()
{
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),k=read();
add(u,v,k),add(v,u,k);
}
for(int i=1;i<=n;i++) d[i]=2e9;
q.push((A){1,d[1]=0});
bool f=0;
for(int i=1;i<=n;i++)
{
while(!q.empty()&&fl[q.top().id]) q.pop();
if(q.empty())
{
f=1; break;
}
int u=q.top().id; q.pop();
fl[u]=1; ans+=d[u];
for(int e=he[u];e;e=nxt[e])
{
int v=to[e];
if(!fl[v]&&d[v]>w[e]) q.push((A){v,d[v]=w[e]});
}
}
if(f) puts("orz");
else printf("%d\n",ans);
}
}
int main()
{
n=read(),m=read();
if(n&1) kru::main();
else prim::main();
return 0;
}

本文介绍了一种求解最小生成树(MST)的问题,并通过Kruskal和Prim两种算法实现。详细介绍了输入输出格式及样例,同时给出了完整的C++代码实现。
409

被折叠的 条评论
为什么被折叠?



