P3366 【模板】最小生成树

来源:互联网 发布:js数学公式编辑器 编辑:程序博客网 时间:2024/06/04 18:24

https://www.luogu.org/problem/show?pid=3366
题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出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
prim算法版,带有注释

#include<bits/stdc++.h>using namespace std;int n,m,x,y,z,i,j,v[5001],p[5001],a[5010][5010],k,s;int main(){    cin>>n>>m;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++) a[i][j]=99999999;    for(i=1;i<=m;i++)    {            cin>>x>>y>>z;            if(z<a[x][y])a[x][y]=z,a[y][x]=z;//有重边选取最小的     }        for(i=0;i<=n;i++)           v[i]=0,p[i]=99999999;//初始的时候把每一个点的值设为最大,设置为都可以访问            p[1]=0;//从顶点一开始,值设为0            for(i=1;i<=n;i++)           {                  k=0;            for(j=1;j<=n;j++)                  if(!v[j]&&p[j]<p[k]) k=j;                v[k]=1;//设为为已访问过                 for(j=1;j<=n;j++)                    if(!v[j]&&a[k][j]<p[j]) p[j]=a[k][j];//取最小值            }           for(i=1;i<=n;i++)              s+=p[i];              cout<<s;}

克鲁斯卡尔版最小生成树,要到结构体,还要用到并查集的相关内容

#include<bits/stdc++.h>using namespace std;int n,m,i,j,s,t,f[5010];struct ss//结构体 {    int x;int y;int z;}a[200010];int cmp(ss c,ss d){    return c.z<d.z;}int find(int x)//查找根节点 {    if(f[x]==x) return f[x];    else      return f[x]=find(f[x]);}int get(int x,int y)//合并 函数 {    int q=find(x),p=find(y);    if(q!=p)       f[q]=find(p);//不在一个集合里面就合并 }int main(){    cin>>n>>m;         for(i=1;i<=m;i++)             cin>>a[i].x>>a[i].y>>a[i].z;             sort(a+1,a+1+m,cmp);             for(i=1;i<=n;i++)                      f[i]=i;             for(i=1;i<=m;i++)                   {                    if(find(a[i].x)!=find(a[i].y))//如果根节点不同,就合并                      get(a[i].x,a[i].y),t++,s+=a[i].z;                         if(t==n-1)                               break;                   }    if(t!=n-1)      cout<<"orz";      else         cout<<s<<endl;    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大四体育没过怎么办 大二体育挂了怎么办 大学体育刚刚及格怎么办 大学体育课没选怎么办 大专挂科拿不到毕业证怎么办 大学专业课挂科怎么办 专科重修没过怎么办 大学毕业证没领怎么办 大一数学挂科怎么办 大学体育课挂了怎么办 大一考试挂科怎么办 一年级孩子考试不及格怎么办 孩子一年级数学不及格怎么办 一年级孩子考试紧张怎么办 健身动作不标准怎么办 足球赛踢平了怎么办 踢球指甲淤血了怎么办 初中一年级成绩差怎么办 着火了怎么办小班教案 小孩爱玩游戏怎么办 幼儿上学哭闹老师怎么办 孩子不喜欢上幼儿园怎么办 幼儿喜欢脱鞋怎么办 幼儿在教室乱跑怎么办 转学学校不接收怎么办 留守儿童成绩差怎么办 感冒鼻孑堵咳嗽哮喘怎么办 二年级数学报怎么办 不敢翻前滚翻怎么办啊 大学全挂了怎么办 幼儿园热了怎么办教案 幼儿园小班热了怎么办教案 高考艺术生色弱怎么办 雾眉后出现白棱怎么办 lol皮肤重复了怎么办 怕篮球砸到怎么办 前滚翻向一侧偏怎么办 大腿肌肉比较发达怎么办 学计算机老了怎么办 新生儿头尖尖的怎么办 手抻筋了很疼怎么办