1825: 【模板】最小生成树
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:8
解决:0
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。
参考文档:https://blog.csdn.net/ZhuRanCheng/article/details/119791246
【prime算法】
#include<iostream> #include<algorithm> using namespace std; const int N = 5005; const int M = 200005; int n,m; //并查集 int pre[N]; int find(int x){ int r = x; while(pre[r]!=r){ r = pre[r]; } int k = x; while( pre[k]!=r ){ k = pre[k]; pre[k] = r; } return r; } void join(int x,int y){ int fx = find(x),fy = find(y); if( fx != fy ) pre[fx] = fy; } //邻接表存图 struct edge{ int x,y,z; }e[2*M]; bool cmp(edge a, edge b){ return a.z < b.z ; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) pre[i] = i; int x,y,z; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); e[i] = (edge){x,y,z}; } sort(e+1,e+m+1,cmp); int cnt = 0; int sum = 0; for(int i=1;i<=m;i++){ if( find(e[i].x) != find(e[i].y) ){ cnt++; join(e[i].x,e[i].y); sum += e[i].z; } } if( cnt == n-1 ) cout<<sum; else cout<<"orz"; return 0; }
【kruskal算法】
#include<bits/stdc++.h> using namespace std; const int N =5005; const int M = 200005; const int oo = 0x3fffffff; struct node{ int to,w; bool operator > (const node &x)const{ return w>x.w; } }; //struct cmp{ // bool operator () (const node &a, const node &b) { // return a.w > b.w ; // } //}; vector<node> G[N]; int d[N]; int vis[N]; int n,m; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) d[i] = oo; int x,y,z; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); G[x].push_back( (node){y,z} ); G[y].push_back( (node){x,z} ); } d[1] = 0; priority_queue< node , vector<node> ,greater<node> > q; q.push( (node){ 1,0 } ); while(!q.empty()){ int k = q.top().to; q.pop(); if( vis[k] == 1 ) continue; vis[k] = 1; for(int j=0;j<G[k].size();j++){ int to = G[k][j].to; int w = G[k][j].w; if( w < d[to] && !vis[to] ){ d[to] = w; q.push( (node){to,w} ); } } } bool flag = 1; int sum = 0; for(int i=1;i<=n;i++){ if( vis[i] == 0 ){ flag = 0; break; } sum += d[i]; } if( flag ) cout<<sum; else cout<<"orz"; return 0; }
输入
第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。
接下来 M 行每行包含三个整数 Xi,Yi,Zi,表示有一条长度为 Zi 的无向边连接结点 Xi,Yi。
输出
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出
orz
。样例输入 复制
4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3
样例输出 复制
7
提示
对于 100% 的数据:1≤N≤5000,1≤M≤2×105,1≤Zi≤104。