POJ1523 SPF (求割点)
2015-07-20 13:51
337 查看
传送门
题目大意:求出每一个割点能将图分成几个部分。
思路:乱搞O(∩_∩)O(遇见割点,在对应的数组里加1就行了),但是要注意输出格式很坑,每次要多输出一个空行。
题目大意:求出每一个割点能将图分成几个部分。
思路:乱搞O(∩_∩)O(遇见割点,在对应的数组里加1就行了),但是要注意输出格式很坑,每次要多输出一个空行。
#include<cstdio> #include<cstring> #define min(a,b) (a)<(b)?(a):(b) #define MAXN 5005 #define MAXM 20005 struct node { int v; node *next; } Edge[MAXM], *Adj[MAXN], *Mcnt = Edge; void addedge(int u, int v) { node *t = ++Mcnt; t->v = v; t->next = Adj[u]; Adj[u] = t; } int dfn[MAXN], low[MAXN], cnt, rtson; int isc[MAXN]; // 表示去掉某个点能将图分成几部分 void dfs(int u, int fa) { dfn[u] = low[u] = ++cnt; int son = 0; for(node *p = Adj[u]; p; p = p->next) { if(!dfn[p->v]) { dfs(p->v, u); low[u] = min(low[u],low[p->v]); if(low[p->v] >= dfn[u] && fa != -1) ++isc[u]; son++; } else if(p->v != fa)low[u] = min(low[u], dfn[p->v]); } if(fa == -1 && son > 1) rtson = son; } int main() { int t1, t2; int Cas = 0; while(~scanf("%d", &t1)) { ++Cas; if(t1 == 0)return 0; scanf("%d", &t2); memset(Adj, 0, sizeof Adj); memset(isc, 0, sizeof isc); memset(dfn, 0, sizeof dfn); memset(low, 0, sizeof low); Mcnt = Edge; cnt = 0; rtson = 0; addedge(t1, t2); addedge(t2, t1); while(~scanf("%d", &t1)) { if(t1 == 0) break; scanf("%d", &t2); addedge(t1, t2); addedge(t2, t1); } dfs(1, -1); bool flag = 1; printf("Network #%d\n",Cas); if(rtson>1) isc[1] = rtson; for(int i = 1; i <= cnt; i++) if(isc[i]) { printf(" SPF node %d leaves %d subnets\n", i, isc[i] + (i != 1)); //因为若不是根节点,除了能分出几个子树外,还留下了一块 flag = 0; } if(flag) puts(" No SPF nodes"); putchar('\n'); } return 0; }
相关文章推荐
- Android 四大组件学习之Activity七
- JAVA中的数据存储(堆及堆栈)
- Google正式加入OpenStack基金会 推动Docker与混合云加速融合
- Qt数据库:(四)利用QSqlQuery类执行SQL语句(二)
- POJ1523 SPF (求割点)
- zznuoj 1909: yifan的数组
- jQuery.outerWidth() 函数详解
- linux 命令 连接ftp服务器
- 从系统UITabbar到自定义UITabbar
- 1051. Pop Sequence (25)
- ORACLE 多表关联 UPDATE 语句
- XML数据结构 SAX 解析
- 1051. Pop Sequence (25)
- shell截取字符串的方法
- 标准Web系统的架构分层
- open/close函数的使用
- Android:Layout_weight的深刻理解
- Android,iOS打开手机QQ与指定用户聊天界面
- 乌云白帽子大会感受
- Callabble和Future