[边双]hihocoder 1184——边的双连通分量
2017-10-29 07:53
363 查看
题目梗概
裸的边双。解题思路
没有桥的极大图就是边双。考虑怎么求桥。
Tanjan的时候回不去的就是桥,即low[son[j]]>dfn[x]
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=20005,maxm=200005; int tot=-1,lnk[maxn],son[maxm],nxt[maxm]; int n,m,dfn[maxn],low[maxn],ans[maxn],tim,G,vis[maxn]; bool c[maxm],ins[maxn]; inline int _read(){ int num=0;char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=getchar(); return num; } void add(int x,int y){nxt[++tot]=lnk[x];lnk[x]=tot;son[tot]=y;} void tarjan(int x,int fa){ dfn[x]=low[x]=++tim; for (int j=lnk[x];j!=-1;j=nxt[j]) if (!dfn[son[j]]){ tarjan(son[j],x); low[x]=min(low[x],low[son[j]]); if (low[son[j]]>dfn[x]) c[j]=1,c[j^1]=1; }else if (son[j]!=fa) low[x]=min(low[x],dfn[son[j]]); } void DFS(int x){ vis[x]=G;ans[G]=min(ans[G],x); for (int j=lnk[x];j!=-1;j=nxt[j]) if (!vis[son[j]]&&!c[j]) DFS(son[j]); } int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); n=_read(),m=_read(); memset(lnk,255,sizeof(lnk)); for (int i=1;i<=m;i++){ int x=_read(),y=_read(); add(x,y);add(y,x); } for (int i=1;i<=n;i++) tarjan(i,0); memset(ans,63,sizeof(ans)); for (int i=1;i<=n;i++) if (!vis[i]) G++,DFS(i); printf("%d\n",G); for (int i=1;i<=n;i++) printf("%d ",ans[vis[i]]); return 0; }
相关文章推荐
- hihocoder1184 连通性二·边的双连通分量
- hihoCoder_#1184_连通性二·边的双连通分量
- hihoCoder_#1190_连通性·四·点的双连通分量(块)
- Tarjan(无向图双联通分量)——hihoCoder 1184
- [hihoCoder 1190] 连通性·四:点-双连通分量
- HohoCoder 1184 : 连通性二·边的双连通分量(+原理证明)
- #1184 : 连通性二·边的双连通分量
- HIHO #1184 : 连通性二·边的双连通分量
- #1184 : 连通性二·边的双连通分量
- hihocoder #1184 : 连通性二·边的双连通分量
- [HIHO1184]连通性二·边的双连通分量(双连通分量)
- 【边双联通分量】hihoCoder#1184 连通性二·边的双连通分量
- hihocoder 完全背包
- hihoCoder1509 : 异或排序
- Hihocoder 1502 - 最大子矩阵
- hihoCoder - 1268 九宫
- 记忆化搜索之一: hihoCoder 1491 : Monster Killing
- hihocoder 1305 区间求差(经典问题)
- hihoCoder 1014 : Trie树
- hihoCoder1052—基因工程