hdu3836 Equivalent Sets(有向图至少添加多少条边才能变为强连通图+tarjan缩点)
2015-09-16 21:17
399 查看
题目链接:点击打开链接
题意描述:对于给定的有向图,至少要添加多少条边,才能使之成为强连通图
解题思路:tarjan缩点+DAG性质
1、DAG性质:对于一个有向无环图,若想让它成为强连通图,至少需要添加max(a,b) a为入度为0的边点的数量,b为出度为0的点的数量
2、通过tarjan缩点将普通的有向图转换为有向无环图,注意当图本身就是强连通时(如只有1个点)时不需要添加边
代码:
题意描述:对于给定的有向图,至少要添加多少条边,才能使之成为强连通图
解题思路:tarjan缩点+DAG性质
1、DAG性质:对于一个有向无环图,若想让它成为强连通图,至少需要添加max(a,b) a为入度为0的边点的数量,b为出度为0的点的数量
2、通过tarjan缩点将普通的有向图转换为有向无环图,注意当图本身就是强连通时(如只有1个点)时不需要添加边
代码:
#include <iostream> #include <cstring> #include <cstdio> #define MAXN 20010 #define MAXE 50010 using namespace std; int head[MAXN],tot1,tot2; struct Edge{ int u,v,next; }e1[MAXE],e2[MAXN]; void addEdge(int u,int v,Edge* edge,int& tol){ edge[tol].u=u;edge[tol].v=v; edge[tol].next=head[u];head[u]=tol++; } int n,m; int low[MAXN],dfn[MAXN],stack[MAXN],belong[MAXN],num[MAXN]; bool instack[MAXN]; int scc,top,index; void Tarjan(int u){ int v; low[u]=dfn[u]=++index; stack[top++]=u; instack[u]=true; for(int i=head[u];i!=-1;i=e1[i].next){ v=e1[i].v; if(!dfn[v]){ Tarjan(v); if(low[u]>low[v]) low[u]=low[v]; } else if(instack[v]&&low[u]>dfn[v]) low[u]=dfn[v]; } if(low[u]==dfn[u]){ ++scc; do{ v=stack[--top]; instack[v]=false; belong[v]=scc; num[scc]++; }while(u!=v); } } int inde[MAXN],outde[MAXN]; void solve(){ memset(dfn,0,sizeof(dfn)); memset(instack,false,sizeof(instack)); memset(num,0,sizeof(num)); scc=top=index=0; for(int i=1;i<=n;++i) if(!dfn[i]) Tarjan(i); tot2=0;memset(head,-1,sizeof(head)); memset(inde,0,sizeof(inde)); memset(outde,0,sizeof(outde)); int u,v; for(int i=0;i<m;++i){ u=belong[e1[i].u]; v=belong[e1[i].v]; if(u!=v){ addEdge(u,v,e2,tot2); inde[v]++; outde[u]++; } } int a=0,b=0; for(int i=1;i<=scc;++i){ if(!inde[i]) a++; if(!outde[i]) b++; } if(scc==1)printf("0\n");///特殊情况当图本身为强联通图时,输出0 else printf("%d\n",max(a,b)); } int main() { while(scanf("%d%d",&n,&m)==2){ tot1=0;memset(head,-1,sizeof(head)); int u,v; for(int i=0;i<m;++i){ scanf("%d%d",&u,&v); addEdge(u,v,e1,tot1); } solve(); } return 0; }
相关文章推荐
- 【UIActivityIndicator活动指示器控件】
- iOS疯狂讲解之KVO键值观察者(key- values-observer)
- 关于导航栏和状态栏的一些UI设置
- NGUI的UI Root
- easyui+rest服务,ajax请求session过期不跳转问题解决
- SQL Server ->> DISABLE索引后插入更新数据再REBUILD索引 和 保留索引直接插入更新数据的性能差异
- UITabBarController
- 【Android笔记】多线程与 UI 交互的方法
- C#中return、break、continue的用法
- 【Android笔记】多线程与 UI 交互的方法
- iOS——UI学习笔记(3)
- UIView 总复习
- USACO Section 1.4 More Search Technique
- UIWindow
- iOS——UI学习笔记(1)
- UIPickerView
- UITableView
- 文本输入控件 UITextField
- UI_模态跳转
- UIScrollView