图算法6之1008
2016-07-06 09:50
218 查看
1 题目编号:1008
2 题目内容:
Problem Description
In graph theory, a pseudoforest is an undirected graph in which every connected component has at most one cycle. The maximal pseudoforests of G are the pseudoforest subgraphs of G that are not contained within any larger pseudoforest of G. A pesudoforest is
larger than another if and only if the total value of the edges is greater than another one’s.<br><br>
Input
The input consists of multiple test cases. The first line of each test case contains two integers, n(0 < n <= 10000), m(0 <= m <= 100000), which are the number of the vertexes and the number of the edges. The next m lines, each line consists of three integers,
u, v, c, which means there is an edge with value c (0 < c <= 10000) between u and v. You can assume that there are no loop and no multiple edges.<br>The last test case is followed by a line containing two zeros, which means the end of the input.<br>
Output
Output the sum of the value of the edges of the maximum pesudoforest.<br>
Sample Input
3 3
0 1 1
1 2 1
2 0 1
4 5
0 1 1
1 2 1
2 3 1
3 0 1
0 2 2
0 0
Sample Output
3
5
3 解题思路形成过程:每输入一条边,判断此边两端点是不是在同一颗树上,如果在同一颗树上,判断树是不是有环,如果有环,则不加入此边,如果没环,加入此边(合并);如果两棵树都没有环,直接合并即可,如果只有一棵树有环,可以合并,并标记,如果都有环,显然不能合并
4 代码:
#include<iostream>
using namespace std;
#define M 100005
#define N 10005
struct node
{
int x,y;
int len;
}g[M];
int cmp(const void *a,const void *b)
{
return (*(node *)b).len - (*(node *)a).len;
}
int father[M],n;
int cha(int x)
{
if(x==father[x])
return x;
father[x]=cha(father[x]);
return father[x];
}
int bing(int x,int y)
{
father[cha(x)]=cha(y);
return 0;
}
int main()
{
int k,x,y,z,m,i,ans;
int used
;
while(scanf("%d%d",&n,&m)&&(m||n))
{
for(i=0;i<m;i++)
{
scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].len);
}
for(i=0;i<=n;i++)
father[i]=i;
k=0;
// int max=0;
ans=0;
qsort(g,m,sizeof(g[0]),cmp);
memset(used,0,sizeof(used));
for(i=0;i<m;i++)
{
x=g[i].x;
y=g[i].y;
z=g[i].len;
int ca=cha(x);
int cb=cha(y);
if(ca!=cb)
{
if(used[ca]==0 || used[cb] ==0)
{
ans+=z;
if(used[cb] == 1)
bing(x,y);
else
bing(y,x);
}
}
else if(used[ca]==0)
{
used[ca] = 1;
ans+=z;
}
}
cout<<ans<<endl;
}
return 0;
}
2 题目内容:
Problem Description
In graph theory, a pseudoforest is an undirected graph in which every connected component has at most one cycle. The maximal pseudoforests of G are the pseudoforest subgraphs of G that are not contained within any larger pseudoforest of G. A pesudoforest is
larger than another if and only if the total value of the edges is greater than another one’s.<br><br>
Input
The input consists of multiple test cases. The first line of each test case contains two integers, n(0 < n <= 10000), m(0 <= m <= 100000), which are the number of the vertexes and the number of the edges. The next m lines, each line consists of three integers,
u, v, c, which means there is an edge with value c (0 < c <= 10000) between u and v. You can assume that there are no loop and no multiple edges.<br>The last test case is followed by a line containing two zeros, which means the end of the input.<br>
Output
Output the sum of the value of the edges of the maximum pesudoforest.<br>
Sample Input
3 3
0 1 1
1 2 1
2 0 1
4 5
0 1 1
1 2 1
2 3 1
3 0 1
0 2 2
0 0
Sample Output
3
5
3 解题思路形成过程:每输入一条边,判断此边两端点是不是在同一颗树上,如果在同一颗树上,判断树是不是有环,如果有环,则不加入此边,如果没环,加入此边(合并);如果两棵树都没有环,直接合并即可,如果只有一棵树有环,可以合并,并标记,如果都有环,显然不能合并
4 代码:
#include<iostream>
using namespace std;
#define M 100005
#define N 10005
struct node
{
int x,y;
int len;
}g[M];
int cmp(const void *a,const void *b)
{
return (*(node *)b).len - (*(node *)a).len;
}
int father[M],n;
int cha(int x)
{
if(x==father[x])
return x;
father[x]=cha(father[x]);
return father[x];
}
int bing(int x,int y)
{
father[cha(x)]=cha(y);
return 0;
}
int main()
{
int k,x,y,z,m,i,ans;
int used
;
while(scanf("%d%d",&n,&m)&&(m||n))
{
for(i=0;i<m;i++)
{
scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].len);
}
for(i=0;i<=n;i++)
father[i]=i;
k=0;
// int max=0;
ans=0;
qsort(g,m,sizeof(g[0]),cmp);
memset(used,0,sizeof(used));
for(i=0;i<m;i++)
{
x=g[i].x;
y=g[i].y;
z=g[i].len;
int ca=cha(x);
int cb=cha(y);
if(ca!=cb)
{
if(used[ca]==0 || used[cb] ==0)
{
ans+=z;
if(used[cb] == 1)
bing(x,y);
else
bing(y,x);
}
}
else if(used[ca]==0)
{
used[ca] = 1;
ans+=z;
}
}
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- 渗透技术一瞥(图)
- 图片引发的溢出危机(图)
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- jQuery圆形统计图开发实例
- 手机短信轰炸(图)
- C语言实现图的遍历之深度优先搜索实例
- python数据结构之图的实现方法
- ASP.Net页面生成饼图实例
- 基于Java实现的图的广度优先遍历算法
- ps制作个性的特定形状图
- RelativeLayout浅谈
- 图
- Ext Scheduler Web资源甘特图控件
- 键盘码 图
- 图(1)——图的定义和基本概念
- 图(2)—— 邻接矩阵表示法
- 图(2)—— 邻接矩阵表示法
- 图(3)——邻接链表法
- 图(3)——邻接链表法