HDU 3394 Railway(点双连通分量)
2016-08-02 18:36
417 查看
Description
给一个无向图,如果至少有两个环共用了一些边,那么这些边被认为是冲突边,如果一些边不在任何一个环中,这些边被认为是多余边,问这个图中有多少多余边和冲突边
Input
多组用例,每组用例第一行为两个整数n和m表示该无向图的点数和边数,之后m行每行两个整数u,v表示u和v之间有一条无向边,以0 0结束输入
Output
对于每组用例,输出多余边和冲突边的数量
Sample Input
8 10
0 1
1 2
2 3
3 0
3 4
4 5
5 6
6 7
7 4
5 7
0 0
Sample Output
1 5
Solution
显然多余边就是桥,而对于冲突边,其必然在点双连通分量中出现,如果一个块的点数等于边数,说明其是一个环,没有冲突边,但如果边数大于点数,说明这个块里至少有两个环,简单分析知此时块内所有边均为冲突边,所以问题转变为求桥的数量以及每个块的点数和边数,用Tarjan求点双连通分量,顺便就可以求出桥数,每找到一个块,就统计块内点的数量以及这些点之间连的边数,判断边数是否大于点数,如果大于则将边数累加到答案中
Code
给一个无向图,如果至少有两个环共用了一些边,那么这些边被认为是冲突边,如果一些边不在任何一个环中,这些边被认为是多余边,问这个图中有多少多余边和冲突边
Input
多组用例,每组用例第一行为两个整数n和m表示该无向图的点数和边数,之后m行每行两个整数u,v表示u和v之间有一条无向边,以0 0结束输入
Output
对于每组用例,输出多余边和冲突边的数量
Sample Input
8 10
0 1
1 2
2 3
3 0
3 4
4 5
5 6
6 7
7 4
5 7
0 0
Sample Output
1 5
Solution
显然多余边就是桥,而对于冲突边,其必然在点双连通分量中出现,如果一个块的点数等于边数,说明其是一个环,没有冲突边,但如果边数大于点数,说明这个块里至少有两个环,简单分析知此时块内所有边均为冲突边,所以问题转变为求桥的数量以及每个块的点数和边数,用Tarjan求点双连通分量,顺便就可以求出桥数,每找到一个块,就统计块内点的数量以及这些点之间连的边数,判断边数是否大于点数,如果大于则将边数累加到答案中
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define maxn 11111 #define maxm 222222 struct Edge { int to,next; }edge[maxm]; int head[maxn],tot; int low[maxn],dfn[maxn],stack[maxn],belong[maxn]; int index,top; int block;//点双连通分量的个数 int bridge;//桥的数量 bool instack[maxn]; vector<int>vec; int flag[maxn]; int ans; void add_edge(int u,int v) { edge[tot].to=v,edge[tot].next=head[u],head[u]=tot++; } void Count() { memset(flag,0,sizeof(flag)); for(int i=0;i<vec.size();i++)flag[vec[i]]=1; int count=0; for(int i=0;i<vec.size();i++) { int u=vec[i]; for(int j=head[u];~j;j=edge[j].next) if(flag[edge[j].to]) count++; } count/=2; if(count>vec.size())ans+=count; } void Tarjan(int u,int pre) { int v; low[u]=dfn[u]=++index; stack[top++]=u; instack[u]=1; for(int i=head[u];~i;i=edge[i].next) { v=edge[i].to; if(v==pre)continue; if(!dfn[v]) { Tarjan(v,u); if(low[u]>low[v])low[u]=low[v]; if(low[v]>dfn[u])bridge++; if(low[v]>=dfn[u]) { vec.clear(); block++; int vn; do { vn=stack[--top]; belong[vn]=block; vec.push_back(vn); instack[vn]=0; }while(vn!=v); belong[u]=block; vec.push_back(u); Count(); } } else if(instack[v]&&low[u]>dfn[v]) low[u]=dfn[v]; } } void solve(int n) { memset(dfn,0,sizeof(dfn)); memset(instack,0,sizeof(instack)); index=block=top=bridge=0; for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i,-1); } void init() { tot=0; memset(head,-1,sizeof(head)); } int n,m; int main() { while(~scanf("%d%d",&n,&m),n||m) { init(); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); u++,v++; add_edge(u,v),add_edge(v,u); } ans=0; solve(n); printf("%d %d\n",bridge,ans); } return 0; }
相关文章推荐
- 121.After performing a clean shut down of the database instance for maintenance, you mount the datab
- UVA 514 Rail(栈)
- sushuai.tech全新上线
- tailf、tail -f、tail -F三者区别
- cocoapods遇到error: RPC failed; curl 56 SSLRead() return error -36问题
- offsetof与container_of宏[总结]
- Regionals 2015 >> Asia - Tehran >> 7527 - Funfair【贪心】【dp】
- Hyperledger fabric 源码分析之 peer 服务启动过程
- A + B for you again
- WPF 数据验证失效 Validation Fail on TabControl
- Aizu 0513 Paint Color【离散化+BFS】
- Aizu 0513 Paint Color【离散化+BFS】
- poj 3411 Paid Roads
- 数据仓库-多维分析展示平台Saiku
- Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]"
- Failed to start openstack-nova-compute.service 问题解决
- HDU 1532 Drainage Ditches (最大流模板)
- grails常用快捷键
- Failed to read artifact descriptor for avalon-framework:avalon-framewor
- fails with start neutron-openvswitch-agent returned 6 问题解决