最小生成书模板

http://acm.fjut.edu.cn/Problem.jsp?pid=1545

FJUTOJ 1545

Prim

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5
 6 using namespace std;
 7 #define M 105
 8
 9 const int INF=1<<29;
10
11 int n,m,arr[M][M];
12
13 int prim()
14 {
15     int dis[M],vis[M],i,j,u,ans=0;
16     for(i=1;i<=n;i++)
17         dis[i]=arr[1][i],vis[i]=0;
18     vis[1]=1;
19     for(i=1;i<n;i++)
20     {
21         int mi=INF;
22         for(j=1;j<=n;j++)
23         {
24             if(!vis[j]&&dis[j]<mi)
25             {
26                 mi=dis[j];
27                 u=j;
28             }
29         }
30         vis[u]=1;
31         ans+=dis[u];
32         for(j=1;j<=n;j++)
33         {
34             if(!vis[j]&&arr[u][j]<dis[j])
35             {
36                 dis[j]=arr[u][j];
37             }
38         }
39     }
40     return ans;
41 }
42
43 int main()
44 {
45     int i,j,a,b,c;
46     while(scanf("%d",&n)&&n)
47     {
48         for(i=1;i<=n;i++)
49         {
50             for(j=1;j<=n;j++)
51             {
52                 arr[i][j]=INF;
53             }
54         }
55         scanf("%d",&m);
56         while(m--)
57         {
58             scanf("%d%d%d",&a,&b,&c);
59             arr[a][b]=arr[b][a]=min(arr[a][b],c);
60         }
61         printf("%d\n",prim());
62
63     }
64     return 0;
65 }

kruskal

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 struct edge
 5 {
 6     int from,to,cost;
 7 }arr[105*105];
 8 int n,m,pre[105];
 9 void init()
10 {
11     for(int i=1;i<=n;i++)
12     {
13         pre[i]=i;
14     }
15 }
16 int findx(int x)
17 {
18     if(pre[x]==x)return x;
19     else return pre[x]=findx(pre[x]);
20 }
21 void join(int x,int y)
22 {
23     int fx=findx(x),fy=findx(y);
24     if(fx==fy)return;
25     pre[fy]=fx;
26 }
27 bool same(int x,int y)
28 {
29     return findx(x)==findx(y);
30 }
31 bool cmp(edge a,edge b)
32 {
33     return a.cost<b.cost;
34 }
35 int kruskal()
36 {
37     int ans=0;
38     sort(arr+1,arr+1+m,cmp);
39     for(int i=1;i<=m;i++)
40     {
41         if(same(arr[i].from,arr[i].to))
42         {
43             continue;
44         }
45         join(arr[i].from,arr[i].to);
46         ans+=arr[i].cost;
47     }
48     return ans;
49 }
50 int main()
51 {
52     while(scanf("%d",&n)&&n)
53     {
54         scanf("%d",&m);
55         init();
56         for(int i=1;i<=m;i++)
57         {
58             scanf("%d%d%d",&arr[i].from,&arr[i].to,&arr[i].cost);
59         }
60         printf("%d\n",kruskal());
61     }
62 }

时间: 2024-11-09 19:19:58

最小生成书模板的相关文章

poj 2831 次小生成树模板

/*次小生成树 题意:给你一些路径,现在将一部分路径权值减少后问是否可以替代最小生成树里面的边. 解:次小生成树,即将这条边连上,构成一个环 求出任意两点路径之间的除了这条边的最大值,比较这个最大值>=这条边,说明可以替换. prime算法次小生成树模板 */ #include<stdio.h> #include<string.h> #define N 1100 #define inf 0x3fffffff int ma[N][N]; int Min(int a,int b)

POJ_1679_The Unique MST(次小生成树模板)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23942   Accepted: 8492 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

次小生成树模板

1 kruskal 2 #include <vector> 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <algorithm> 7 #define INF 0x3f3f3f3f 8 9 using namespace std; 10 int n,m; 11 struct data 12 { 13 int u,v,w; 14 bool vis;

uva10600次小生成树模板题

裸题,上模板就行,注意j  !  =  k #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include&

洛谷 P4180 【模板】严格次小生成树[BJWC2010]【次小生成树】

严格次小生成树模板 算法流程: 先用克鲁斯卡尔求最小生成树,然后给这个最小生成树树剖一下,维护边权转点权,维护最大值和严格次大值. 然后枚举没有被选入最小生成树的边,在最小生成树上查一下这条边的两端点的路径上的最长边,如果最长边等于枚举到的边的边权,那么选次长边(没有次长边的话直接跳过),然后在最小生成树的权值上减去路径上最/次长边,加上当前枚举的边的边权 因为如果加入枚举的边的,那么就形成了一个环,需要断开一条边 注意一开始单点次小值赋为0 #include<iostream> #inclu

POJ 1679 prime次小生成树判定生成树是否唯一

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21931   Accepted: 7784 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

[BJOI 2010]次小生成树Tree

Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说: 如果最小生成树选择的边集是 EM,严格次小生成树选择的边集是 ES,那么需要满足:(value(e) 表示边 e的权值)  这下小 C 蒙了,他找到了你,希望你帮他解决这个问题. Input 第一行包含两个整数N 和M,表示无向图

图论——次小生成树

次小生成树模板 通过poj 1679 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <stack> #include <queue> #include <set> using namespace std; #define INF 10000000

一本通1555【例 4】次小生成树

1555:[例 4]次小生成树 时间限制: 1000 ms         内存限制: 524288 KB 题目描述 原题来自:BeiJing 2010 组队赛 给定一张 N 个点 M 条边的无向图,求无向图的严格次小生成树. 设最小生成树的边权之和为 sum,严格次小生成树就是指边权之和大于 sum 的生成树中最小的一个. 输入格式 第一行包含两个整数 N 和 M,表示无向图的点数与边数: 接下来 MM 行,每行三个数 x,y,z,表示点 x 和点 y 之间有一条边,边的权值为 z. 输出格式