51NOD 1212 最小生成树模板
来源:互联网 发布:书生软件安卓 编辑:程序博客网 时间:2024/06/02 10:12
1212 无向图最小生成树
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 141 2 42 3 83 4 74 5 95 6 106 7 27 8 18 9 72 8 113 9 27 9 63 6 44 6 141 8 8
Output示例
37模板题Prim邻接表
#include <iostream>//邻接表#include <cstring>#include <vector>#define inf 0x3f3f3f3fusing namespace std;int n,m;struct node{ int to,num;};vector<node> v[1010];int prim(){ node d; bool visit[1010]; int len[1010]; int sum=0; memset(visit,false,sizeof(visit)); memset(len,inf,sizeof(len)); visit[1]=true; for(int i=0;i<v[1].size();i++){ d=v[1][i]; //cout<<d.to<<" = "<<d.num<<endl; len[d.to]=d.num; } for(int j=1;j<n;j++){ int nn=-1; for(int i=1;i<=n;i++){ //cout<<len[i]<<" "; if(!visit[i]&&(nn==-1||len[i]<len[nn])){ nn=i; } } //cout<<endl; if(nn==-1){ return -1; } sum+=len[nn]; visit[nn]=true; for(int i=0;i<v[nn].size();i++){ d=v[nn][i]; if(!visit[d.to]&&len[d.to]>d.num){ len[d.to]=d.num; } } } return sum;}int main(){ cin.sync_with_stdio(false); int a,b,c; while(cin>>n>>m){ for(int i=1;i<=n;i++){ v[i].clear(); } for(int i=0;i<m;i++){ cin>>a>>b>>c; node d; d.to=b; d.num=c; v[a].push_back(d); d.to=a; v[b].push_back(d); } cout<<prim()<<endl; } return 0;}
Prim
邻接矩阵
#include <iostream>//邻接矩阵#include <cstring>#define inf 0x3f3f3f3fusing namespace std;int n,m;int mapp[1010][1010];int prim(){ bool visit[1010]; int len[1010]; int sum=0; memset(visit,false,sizeof(visit)); visit[1]=true; for(int i=1;i<=n;i++){ len[i]=mapp[1][i]; } for(int j=1;j<n;j++){ int nn=-1; for(int i=1;i<=n;i++){ if(!visit[i]&&(nn==-1||len[i]<len[nn])){ nn=i; } } //cout<<endl; if(nn==-1){ return -1; } sum+=len[nn]; visit[nn]=true; for(int i=1;i<=n;i++){ if(!visit[i]&&len[i]>mapp[nn][i]){ len[i]=mapp[nn][i]; } } } return sum;}int main(){ cin.sync_with_stdio(false); int a,b,c; while(cin>>n>>m){ memset(mapp,inf,sizeof(mapp)); for(int i=0;i<m;i++){ cin>>a>>b>>c; mapp[a][b]=c; mapp[b][a]=c; } cout<<prim()<<endl; } return 0;}
Prim
链式前向星
#include <iostream>//链式前向星#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 1010#define M 50010#define LL __int64#define inf 0x3f3f3f3f3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1000000007;int n, m;struct node {int to, num, next;}edge[M * 2];int head[N];int cnt;void add(int a, int b, int c) {edge[cnt].to = b;edge[cnt].num = c;edge[cnt].next=head[a];head[a] = cnt++;}int prim() {node d;bool visit[1010];int len[1010];int sum = 0;memset(visit, false, sizeof(visit));memset(len, inf, sizeof(len));visit[1] = true;for (int u = head[1]; u != -1; u = edge[u].next) {len[edge[u].to] = edge[u].num;}for (int j = 1; j<n; j++) {int nn = -1;for (int i = 1; i <= n; i++) {if (!visit[i] && (nn == -1 || len[i]<len[nn])) {nn = i;}}if (nn == -1) {return -1;}sum += len[nn];visit[nn] = true;for (int u = head[nn]; u != -1; u = edge[u].next) {if (!visit[edge[u].to] && len[edge[u].to] > edge[u].num) {len[edge[u].to] = edge[u].num;}}}return sum;}int main() {cin.sync_with_stdio(false);int a, b, c;while (cin >> n >> m) {cnt = 0;memset(head, -1, sizeof(head));for (int i = 0; i<m; i++) {cin >> a >> b >> c;add(a, b, c);add(b, a, c);}cout << prim() << endl;}return 0;}
阅读全文
1 0
- 51NOD 1212 最小生成树模板
- 51nod--1212 最小生成树
- 51nod 1212 无向图最小生成树(prim,kruskal模板)
- 贪心算法基础之最小生成树prim算法 51nod prim模板
- 51nod 1212 无向图最小生成树
- 51 nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51nod:1212 无向图最小生成树
- 51Nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 51Nod 1212 无向图最小生成树
- 51nod 1212 无向图最小生成树
- 20141004 【 图论 -- 最小生成树(Dijkstra) 】 51nod 1212 . 无向图最小生成树
- 51nod 1212 无向图最小生成树(最小生成树)
- 51Nod 1212 无向图最小生成树(最小生成树Kruskal & Prim
- HDU 4009 最小树形图
- HDU 2234 IDA*
- HDU 3188 二分图,二进制枚举
- 最小二乘法求解直线方程系数
- 51NOD 1264 两线段相交模板
- 51NOD 1212 最小生成树模板
- 多线程-买电影票出现了同票和负数票的原因分析
- 51NOD 1242 斐波那契数列的第N项
- 51NOD 最长递增子序列(模板)
- HDU 1385 Minimum Transport Cost
- HDU 2586 How far away?(lca模板)
- HDU 3486 Interviewe(RMQ问题)
- HDU 2121 Ice_cream’s world II
- Future结合RxJava 实现异步调用