博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1144
阅读量:4312 次
发布时间:2019-06-06

本文共 1722 字,大约阅读时间需要 5 分钟。

求无向图的割顶和桥的裸题。

#include 
#include
#include
using namespace std;const int maxn = 105, maxm = maxn * maxn;int n, m, tot, dfs_clock;int h[maxn], dfn[maxn], low[maxn], iscut[maxn]; struct edge{ int v, next;}a[maxm];void add(int x, int y){ a[tot].v = y; a[tot].next = h[x]; h[x] = tot++;}int dfs(int u, int fa){ int lowu = dfn[u] = ++dfs_clock; int child = 0; for (int i = h[u]; ~i; i = a[i].next) { int v = a[i].v; if (!dfn[v]) { child++; int lowv = dfs(v, u); lowu = min(lowu, lowv); if (lowv >= dfn[u]) { iscut[u] = 1; }// if (lowv > dfn[u])// {// printf("%d - %d\n", u, v);// } }else if (dfn[v] < dfn[u] && v != fa) { lowu = min(lowu, dfn[v]); } } if (fa == 0 && child == 1) { iscut[u] = 0; } low[u] = lowu; return lowu;}int main(){// freopen("poj1144.in","r",stdin); while (scanf("%d", &n) && n) { memset(h, -1, sizeof h); tot = dfs_clock = 0; memset(low, 0, sizeof low); memset(dfn, 0, sizeof dfn); memset(iscut, 0, sizeof iscut); int x; while (scanf("%d", &x) && x) { while (getchar() != '\n') { int y; scanf("%d", &y); add(x, y); add(y, x); } } dfs(1, 0); int ans = 0; for (int i = 1; i <= n; i++) if (iscut[i]) ans++; printf("%d\n", ans); } return 0;}

恶心的地方在于读入,以及千万不要忘记初始化!!!

转载于:https://www.cnblogs.com/yohanlong/p/7768603.html

你可能感兴趣的文章
树结构练习——排序二叉树的中序遍历
查看>>
AC自动机模板
查看>>
python 基本语法
查看>>
Oracle JDBC hang on
查看>>
inotify+rsync实现实时热备
查看>>
C#杂问
查看>>
Cocoapods的使用教程
查看>>
Swift - 点击箭头旋转
查看>>
SpringBoot学习(四)
查看>>
深入理解javascript作用域系列第四篇
查看>>
git配置
查看>>
bing智能提示搜索框实现
查看>>
12月月计划与周计划
查看>>
分享Java开发的利器-Lombok
查看>>
实战中总结出来的CSS常见问题及解决办法
查看>>
01-Stanford-Overview of iOS & MVC 摘要及笔记
查看>>
11.5
查看>>
JAVA类加载器一 父类委托机制
查看>>
__new__和__init__的区别
查看>>
promise
查看>>