HDU3367 Pseudoforest
2014-03-06 19:40
344 查看
Pseudoforest
题目链接:Click Here~
题目分析:
就是给你一张图,要求你找出一个森林。而这个森林可以形成环,但是最多只能有一个环。所以,就想到了,对有无环和到底有几个环进行判断就可以了。
算法分析:
运用Kruscal和并查集进行类最长路的做法,模拟算法。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e4 + 5;
struct Node
{
int u,v,c;
bool operator < (const Node &a)const{
return c > a.c;
}
}node[N*10];
int n,m,fa
,vst
;
inline void Init()
{
for(int i = 0;i < N;++i)
fa[i] = i,vst[i] = 0;
}
int Find(int u)
{
if(u == fa[u])
return fa[u];
return fa[u] = Find(fa[u]);
}
int Kruscal()
{
int ans = 0;
for(int i = 0;i < m;++i){
int a = Find(node[i].u),b = Find(node[i].v);
if(a != b){
if(vst[a]&&vst[b]) //两棵树合并会造成两个环
continue;
if(vst[a]) //有一个环
fa[b] = a;
else if(vst[b]) //有一个环
fa[a] = b;
else //没环
fa[a] = b;
ans += node[i].c;
}else //加入后会形成一个环
{
if(vst[a]) //原本就有一个环
continue;
vst[a] = 1;
ans += node[i].c;
}
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m),(n||m))
{
Init();
for(int i = 0;i < m;++i)
scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].c);
sort(node,node+m);
printf("%d\n",Kruscal());
}
return 0;
}
题目链接:Click Here~
题目分析:
就是给你一张图,要求你找出一个森林。而这个森林可以形成环,但是最多只能有一个环。所以,就想到了,对有无环和到底有几个环进行判断就可以了。
算法分析:
运用Kruscal和并查集进行类最长路的做法,模拟算法。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e4 + 5;
struct Node
{
int u,v,c;
bool operator < (const Node &a)const{
return c > a.c;
}
}node[N*10];
int n,m,fa
,vst
;
inline void Init()
{
for(int i = 0;i < N;++i)
fa[i] = i,vst[i] = 0;
}
int Find(int u)
{
if(u == fa[u])
return fa[u];
return fa[u] = Find(fa[u]);
}
int Kruscal()
{
int ans = 0;
for(int i = 0;i < m;++i){
int a = Find(node[i].u),b = Find(node[i].v);
if(a != b){
if(vst[a]&&vst[b]) //两棵树合并会造成两个环
continue;
if(vst[a]) //有一个环
fa[b] = a;
else if(vst[b]) //有一个环
fa[a] = b;
else //没环
fa[a] = b;
ans += node[i].c;
}else //加入后会形成一个环
{
if(vst[a]) //原本就有一个环
continue;
vst[a] = 1;
ans += node[i].c;
}
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m),(n||m))
{
Init();
for(int i = 0;i < m;++i)
scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].c);
sort(node,node+m);
printf("%d\n",Kruscal());
}
return 0;
}
相关文章推荐
- sql优化案例-从走索引变成走分区消除
- hdu_1026
- 非越狱手机访问沙盒
- Canvas制作 撞球游戏 简单易学
- zigbee__AF_DataRequest函数详解
- windows下和linux下 Redis 安装
- Codeforces Round #234 (Div. 2)
- 把手教你玩转SOCKET模型之重叠I/O篇(下)
- 学生数据管理
- poj1703 种类并查集
- Object C——自学笔记(1)
- redis 扩展安装使用
- Ehcache配置文件的详细说明
- Ext.Net 复制GridPanel的数据
- C#richTextBox1保存txt文档
- (CF)C. Inna and Huge Candy Matrix
- 反转链表
- (补)第一周 日期结构体
- hdu 1712ACboy needs your help 01背包(分组)
- 将Activity设置成半透明的对话框