博 客 测 试 --> P3366【模板】最小生成树

P3366【模板】最小生成树

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式

第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数 Xi,Yi,Zi,表示有一条长度为 Zi 的无向边连接结点 Xi,Yi

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz

样例 #1

样例输入 #1

4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3

样例输出 #1

7

提示

数据规模:

对于 20% 的数据,N5M20

对于 40% 的数据,N50M2500

对于 70% 的数据,N500M104

对于 100% 的数据:1N50001M2×1051Zi104

样例解释:

所以最小生成树的总边权为 2+2+3=7

代码

点击查看代码
#include<bits/stdc++.h> using namespace std; #define maxn 5005 #define maxm 200005 #define INF 1e9 int n,m; int mp[maxn][maxn]; int dis[maxn]; bool vis[maxn]; int ans; void init() { for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) mp[i][j]=INF; for(int i=1;i<=n;++i) dis[i]=INF; } bool prim() { vis[1]=1; for(int i=1;i<=n;++i) dis[i]=mp[1][i]; int minpath,now=1; for(int i=2;i<=n;++i) { minpath=INF; for(int j=1;j<=n;++j) if(!vis[j]&&dis[j]<minpath) { minpath=dis[j]; now=j; } if(minpath==INF) return false; ans+=minpath; vis[now]=1; for(int j=1;j<=n;j++) if(dis[j]>mp[now][j]) dis[j]=mp[now][j]; } return true; } int main() { cin>>n>>m; init(); int i; int u,v,w; for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); mp[u][v]=min(mp[u][v],w); mp[v][u]=min(mp[v][u],w); } if(!prim()) cout<<"orz"<<endl; else cout<<ans; return 0; }

__EOF__

本文作者WAinAll
本文链接https://www.cnblogs.com/WAinAll/p/16980186.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   WAinAll  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示