ZOJ1119(SPF)
2016-05-21 15:58
344 查看
题目链接:传送门
题目大意:一副无向图,问有多少个节点满足删除该节点后图不连通,对于每个满足条件的节点,输出节点编号及删除节点将图分为几个连通块。若没有节点满足则输出No SPF nodes
题目思路:tarjan算法求关节点入门题(也可用矩阵存图)
题目大意:一副无向图,问有多少个节点满足删除该节点后图不连通,对于每个满足条件的节点,输出节点编号及删除节点将图分为几个连通块。若没有节点满足则输出No SPF nodes
题目思路:tarjan算法求关节点入门题(也可用矩阵存图)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <cctype> #include <queue> #include <string> #include <vector> #include <set> #include <map> #include <climits> #define lson root<<1,l,mid #define rson root<<1|1,mid+1,r #define fi first #define se second #define ping(x,y) ((x-y)*(x-y)) #define mst(x,y) memset(x,y,sizeof(x)) #define mcp(x,y) memcpy(x,y,sizeof(y)) #define Min(x,y) (x<y?x:y) #define Max(x,y) (x>y?x:y) using namespace std; #define gamma 0.5772156649015328606065120 #define MOD 100000007 #define inf 0x3f3f3f3f #define N 1000005 #define maxn 1000050 typedef long long LL; typedef pair<int,int> PII; int n,m,head[1001],hcnt,son,num; int dfn[1001],low[1001],area[1001],vis[1001]; int deep; struct Node{ int to,next; Node(){} Node(int a,int b):to(a),next(b){} }node[2000800]; inline void add(int x,int y){ node[hcnt]=Node(y,head[x]); head[x]=hcnt++; } void init(){ num=0; ///最大节点的编号 hcnt=0; deep=1; ///深度搜索树的深度优先数(第几个被搜索) son=0; ///记录根节点的子女个数 low[1]=dfn[1]=1; ///low表示节点能通过子女和回边到达的最小深度优先数 mst(head,-1); ///dfn表示节点的深度优先数 mst(vis,0); mst(area,0); ///记录删除某个节点后图被分成了几块 vis[1]=1; ///标记节点是否访问过 } void dfs(int x){ for(int i=head[x];~i;i=node[i].next){ int e=node[i].to; if(vis[e]) low[x]=Min(low[x],dfn[e]); else{ vis[e]=1; dfn[e]=low[e]=++deep; dfs(e); low[x]=Min(low[x],low[e]); if(low[e]>=dfn[x]){ if(x==1) ++son; else ++area[x]; } } } } int main(){ int i,j,group,Case=0,x,y; while(scanf("%d",&x)!=EOF&&x){ init(); num=Max(num,x); scanf("%d",&y); num=Max(num,y); add(x,y); add(y,x); while(scanf("%d",&x)&&x){ num=Max(num,x); scanf("%d",&y); num=Max(num,y); add(x,y); add(y,x); } if(Case)printf("\n"); printf("Network #%d\n",++Case); dfs(1); if(son>1)area[1]=son-1; int flag=0; for(i=1;i<=num;++i)if(area[i]){ flag=1; printf(" SPF node %d leaves %d subnets\n",i,area[i]+1); } if(!flag) printf(" No SPF nodes\n"); } return 0; }
相关文章推荐
- 学习练习 java 实例属性 静态属性
- 文件上传工具类(重命名,以及判断类型)
- phpjm解密程序,也适用于其他混淆加密的破解
- CSS float浮动的深入研究、详解及拓展(二)
- C++图像处理中从硬盘读入图像文件,并将相应数据赋值给图像类的char**data成员
- Java线程池使用说明
- Class文件结构
- 软键盘挤压布局的问题
- 字符串测试题1
- maven出错The folder is already a source folder
- css样式问题,table中的td值撑开了,样式变了
- mysql 安装 和 配置 在 centos 7
- POJ-1287-Networking(最小生成树 普利姆)
- 移动开发内存分类
- new和delete 基类指针指向继承类的对象时,delete的过程
- c++实现矩阵的余弦相似度
- 学习练习 java面向对象封装汽车
- IIS配置
- Axure 实现数字自动加键功能(点击“+”数字加1,点击“-”数字减1)
- PHP学习笔记——文件操作