POJ--2421--Constructing Roads【最小生成树】
来源:互联网 发布:博丽灵梦动态壁纸软件 编辑:程序博客网 时间:2024/06/06 23:44
链接:http://poj.org/problem?id=2421
题意:n个村庄,告诉你任两个村庄间距离,要建一些路使得任两个村庄都可以互相到达,需要使花费最小,其中有q条路已经建了,求最小花费。
把已经建的路的权值改为0,再prim就行了。kruskal做的话,把建好的路用并查集合并,再kruskal就行了
prim算法
#include<cstring>#include<string>#include<fstream>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 110#define eps 1e-7#define INF 0x7FFFFFFF#define seed 131#define ll long long#define ull unsigned ll#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int edge[MAXN][MAXN],vis[MAXN],dist[MAXN];int n,m,ans;void prim(){ int i,j; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dist[i] = edge[1][i]; vis[1] = 1; for(i=0;i<n-1;i++){ int temp = INF,k = -1; for(j=1;j<=n;j++){ if(!vis[j]&&dist[j]<temp){ temp = dist[j]; k = j; } } if(k==-1) break; vis[k] = 1; ans += dist[k]; for(j=1;j<=n;j++){ if(!vis[j]&&edge[k][j]<dist[j]) dist[j] = edge[k][j]; } }}int main(){ int i,j,q,a,b; int x; while(scanf("%d",&n)!=EOF){ ans = 0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&edge[i+1][j+1]); } } scanf("%d",&q); while(q--){ scanf("%d%d",&a,&b); edge[a][b] = edge[b][a] = 0; } prim(); printf("%d\n",ans); } return 0;}
kruskal算法
#include<cstring>#include<string>#include<fstream>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 110#define eps 1e-7#define INF 0x7FFFFFFF#define seed 131#define ll long long#define ull unsigned ll#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct node{ int u,v,dis;}edge[1001000];int father[MAXN];int n,m,ans,cnt;bool cmp(node x,node y){ return x.dis<y.dis;}int find(int x){ int t = x; while(t!=father[t]) t = father[t]; int k = x; while(k!=t){ int temp = father[k]; father[k] = t; k = temp; } return t;}void kruskal(){ int i; for(i=0;i<m;i++){ int a = find(edge[i].u); int b = find(edge[i].v); if(a!=b){ father[a] = b; ans += edge[i].dis; cnt++; if(cnt>=n-1) break; } }}int main(){ int t,q,i,j,a,b; int x; while(scanf("%d",&n)!=EOF){ m = 0; cnt = 0; ans = 0; for(i=1;i<=n;i++){ father[i] = i; for(j=1;j<=n;j++){ scanf("%d",&x); edge[m].u = i; edge[m].v = j; edge[m].dis = x; m++; } } scanf("%d",&q); for(i=0;i<q;i++){ scanf("%d%d",&a,&b); int aa = find(a); int bb = find(b); if(aa!=bb){ father[aa] = bb; cnt++; } }// cout<<ans<<" "<<cnt<<endl; sort(edge,edge+m,cmp); if(cnt<n-1) kruskal(); printf("%d\n",ans); } return 0;}
0 0
- POJ 2421 Constructing Roads(最小生成树)
- POJ 2421 Constructing Roads 最小生成树
- POJ 2421 Constructing Roads 最小生成树
- POJ 2421 Constructing Roads 最小生成树
- POJ--2421--Constructing Roads【最小生成树】
- POJ 2421 -Constructing Roads -最小生成树
- 【最小生成树】POJ 2421 Constructing Roads
- POJ 2421 Constructing Roads 最小生成树
- Constructing Roads 【poj-2421】【最小生成树】
- POJ-2421 Constructing Roads (最小生成树)
- poj 2421 Constructing Roads prim最小生成树 基础!!!
- POJ-2421(最小生成树模版)(Constructing Roads )
- Poj 2421 Constructing Roads(Prim 最小生成树)
- POJ 2421 Constructing Roads(简单最小生成树)
- poj 2421 Constructing Roads 并查集+最小生成树
- poj-2421 Constructing Roads(最小生成树 Kruskal算法)
- poj 2421 Constructing Roads(最小生成树 kruskal算法)
- poj 2421 Constructing Roads(最小生成树))
- 精通CSS(2)-布局
- 后的发挥斯蒂芬活动方式
- android json解析及简单例子
- POJ 1577 Falling Leaves(二叉搜索树)
- EBS Form开发利用QUERY_FIND来实现最简单的查询功能
- POJ--2421--Constructing Roads【最小生成树】
- 关于AFNetWorking编码格式问题
- Android L - Bottom Sheets 规格
- linux下C++读取文件,获取文件大小。
- IOS 启动画面和图标设置(适配IOS7 and Xcode5)
- Python中的闭包
- C++中关于strtok()函数的用法
- linux下格式化字符sprintf
- 2014山东政法干警考试职位查询检索入口