POJ 1144 Network (割点)
2017-07-14 20:47
274 查看
思路:
模版似的tarjan求割点。注意本题输入很坑。。根本没必要这么搞啊。。
(我一开始读的char,被坑死,后来换了一种别人的写法就OK了)
#include <cstdio> #include <iostream> #include <string.h> #include <algorithm> using namespace std; const int maxn = 110; int ma[maxn][maxn]; int dfn[maxn],low[maxn],vis[maxn],stak[maxn],cntc,cntv,cnts,index; int n; void dfs(int u,int f){ dfn[u]=low[u]=++index; stak[cnts++] = u; vis[u] = 1;int chil = 0,flagu = 1; for(int i = 1;i <= n;i++){ if(ma[u][i] && i!=f){ chil++; if(!dfn[i]){ dfs(i,u); low[u] = min(low[u],low[i]); if(flagu && dfn[u] <= low[i] && (f != -1||chil > 1) ) { cntv++;flagu = 0; } } else if(vis[i]){ low[u] = min(low[u],dfn[i]); } } } if(dfn[u]==low[u]){ cntc++;int v; do{ v = stak[--cnts]; vis[v]=0; }while(v!=u); } } void tarjan(){ for(int i = 1; i <= n;i++){ if(!dfn[i]) dfs(i,-1); } } int main(){ while(scanf("%d",&n),n){ int u,v; memset(ma,0,sizeof(ma));index = 0,cntc = 0,cntv=0,cnts=0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); while(scanf("%d",&u) && u){ while(getchar()!='\n'){ scanf("%d",&v); ma[u][v]=1; ma[v][u]=1; } } tarjan(); printf("%d\n",cntv); } }
相关文章推荐
- poj 1144 Network 【求无向图中割点总数】【点双联通入门题目】
- poj 1144 Network 无向图求割点
- POJ 1144 Network
- POJ 1144 Network(求无向图中的割点)
- POJ1144 Network 无向图的割顶
- poj&nbsp;1144&nbsp;Network(割点)
- POJ 1144 Network
- poj 1144 Network tarjan求无向连通图的割点个数
- poj 1144 Network(模板题)(Tarjan 关节点的朴素算法)
- poj 1144 Network【双连通分量求割点总数】
- POJ 1144 Network 图论 求割点模板
- POJ 1144 Network(割点数量)
- poj 1144 Network (tarjan求割点)
- POJ 1144 Network
- POJ1144——Network
- POJ 1144 Network(Tarjan)
- POJ 1144 Network 求割点(tarjan)
- POJ 1144 Network (割点模板题)
- Poj 1144 Network
- poj 1144 Network