poj 1861
2013-08-18 15:09
169 查看
刚开始没懂样例,看了discuss才知道.这个题就是考Kruskal.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 99999999
const int maxn = 1010;
using namespace std;
struct edge{
int l,r,w;
}ee[maxn*maxn/2];
int map[maxn][maxn],rt[maxn],path[maxn][2];
int nedge;
bool flag[maxn];
bool Cmp(edge a, edge b) {return a.w < b.w;}
void Build(int n){
for(int i = 1; i <= n; ++i)
rt[i] = i;
}
int Find(int x){
if(rt[x] == x) return x;
return Find(rt[x]);
}
void Union(int x,int y){
int rt1 = rt[x];
int rt2 = rt[y];
if(rt1 != rt2)
rt[rt1] = rt2;
}
void Kruskal(int n){
int rt1,rt2;
int k = 0,ans = -1;
for(int i = 0; i < nedge; ++i){
rt1 = Find(ee[i].l);
rt2 = Find(ee[i].r);
if(rt1 != rt2){
Union(rt1,rt2);
path[k][0] = ee[i].l;
path[k][1] = ee[i].r;
k++;
if(ans < ee[i].w) ans = ee[i].w;
if(k == n) break;
}
}
printf("%d\n%d\n",ans,n-1);
for(int i = 0; i < k; ++i)
printf("%d %d\n",path[i][0],path[i][1]);
}
int main()
{
int n;
while(~scanf("%d",&n)){
Build(n);
int m;
scanf("%d",&m);
nedge = 0;
while(m--){
int a,b,len;
scanf("%d %d %d",&a,&b,&len);
ee[nedge].l = a;
ee[nedge].r = b;
ee[nedge].w = len;
nedge++;
}
sort(ee,ee+nedge,Cmp);
Kruskal(n);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 99999999
const int maxn = 1010;
using namespace std;
struct edge{
int l,r,w;
}ee[maxn*maxn/2];
int map[maxn][maxn],rt[maxn],path[maxn][2];
int nedge;
bool flag[maxn];
bool Cmp(edge a, edge b) {return a.w < b.w;}
void Build(int n){
for(int i = 1; i <= n; ++i)
rt[i] = i;
}
int Find(int x){
if(rt[x] == x) return x;
return Find(rt[x]);
}
void Union(int x,int y){
int rt1 = rt[x];
int rt2 = rt[y];
if(rt1 != rt2)
rt[rt1] = rt2;
}
void Kruskal(int n){
int rt1,rt2;
int k = 0,ans = -1;
for(int i = 0; i < nedge; ++i){
rt1 = Find(ee[i].l);
rt2 = Find(ee[i].r);
if(rt1 != rt2){
Union(rt1,rt2);
path[k][0] = ee[i].l;
path[k][1] = ee[i].r;
k++;
if(ans < ee[i].w) ans = ee[i].w;
if(k == n) break;
}
}
printf("%d\n%d\n",ans,n-1);
for(int i = 0; i < k; ++i)
printf("%d %d\n",path[i][0],path[i][1]);
}
int main()
{
int n;
while(~scanf("%d",&n)){
Build(n);
int m;
scanf("%d",&m);
nedge = 0;
while(m--){
int a,b,len;
scanf("%d %d %d",&a,&b,&len);
ee[nedge].l = a;
ee[nedge].r = b;
ee[nedge].w = len;
nedge++;
}
sort(ee,ee+nedge,Cmp);
Kruskal(n);
}
return 0;
}
相关文章推荐
- POJ 题目1861 Network(最小生成树)
- POJ 1861 Network
- Poj 1861 Network (模版kruskal)
- poj 1861 Network
- poj1861 kruskal
- POJ 1861 Network(MST)
- poj 1861 Network 最小生成树 kruscal算法
- ZOJ 1542 poj 1861 Network(并查集+最小树)
- POJ 1861 & ZOJ 1542 Network(最小生成树之Krusal)
- poj 1861 Networks
- poj 1861 network
- POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)
- POJ 1861 Network
- POJ 1861 kruskal+优先队列+并查集
- poj 1861 Network
- zoj1542||poj 1861(简单-MST)
- POJ 1861最小瓶颈树wa
- POJ 1861 Network(求连接的边) 水题
- POJ 1861题
- POJ 1861/ZOJ 1542 Network