博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Railway HDU - 3394 (点双连通)
阅读量:4992 次
发布时间:2019-06-12

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

Railway

 

题意:一个无向图,1求不在任何一个环里的边数;2求在不止一个环里的边数。

第一问明显就是求桥,第二问,如果求出的某个点双连通分量里面边数多于点数,说明不止一个环,那么所有的边都在不止一个环里。

该求点双连通的,,求成了边双连通。。。要仔细分析问题。

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxv=10010; 7 int n,m; 8 int ans1,ans2; 9 struct Edge{10 int u,v,nex;11 bool iscut;12 }e[100010<<1];13 int head[maxv];14 int cnt;15 void init(){16 memset(head,-1,sizeof(head));17 cnt=0;18 }19 void add(int u,int v){20 e[cnt].u=u;21 e[cnt].iscut=0;22 e[cnt].v=v;23 e[cnt].nex=head[u];24 head[u]=cnt++;25 }26 int pre[maxv],bccno[maxv],dfsk,bcc_cnt;27 int vis[maxv];28 vector
bcc[maxv];29 30 int dfs(int u,int id){31 int lowu=pre[u]=++dfsk;32 for(int i=head[u];i!=-1;i=e[i].nex){33 int v=e[i].v;34 if(i==(id^1)) continue;35 if(!pre[v]){36 int lowv=dfs(v,i);37 lowu=min(lowu,lowv);38 if(lowv>pre[u]) e[i].iscut=e[i^1].iscut=1,ans1++;39 }40 else lowu=min(lowu,pre[v]);41 }42 return lowu;43 }44 void dfs1(int u){45 bccno[u]=bcc_cnt;46 vis[u]=1;47 for(int i=head[u];i!=-1;i=e[i].nex){48 if(e[i].iscut) continue;49 bcc[bcc_cnt].push_back(i);50 int v=e[i].v;51 if(!vis[v]) dfs1(v);52 }53 }54 55 void find_bcc(int n){56 memset(pre,0,sizeof(pre));57 memset(vis,0,sizeof(vis));58 memset(bccno,0,sizeof(bccno));59 dfsk=bcc_cnt=0;60 for(int i=0;i
边双连通=_=
1 #include 
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 const int maxv=10010; 8 int n,m; 9 int ans1,ans2; 10 struct Edge 11 { 12 int u,v,nex; 13 }e[100010<<1]; 14 int head[maxv]; 15 int cnt; 16 void init() 17 { 18 memset(head,-1,sizeof(head)); 19 cnt=0; 20 } 21 void add(int u,int v) 22 { 23 e[cnt].u=u; 24 e[cnt].v=v; 25 e[cnt].nex=head[u]; 26 head[u]=cnt++; 27 } 28 int pre[maxv],bccno[maxv],dfsk,bcc_cnt; 29 stack
s; //存的是边的标号 30 vector
bcc[maxv]; //存的是边的标号 31 int vis[maxv]; 32 33 int dfs(int u,int id){ 34 int lowu=pre[u]=++dfsk; 35 for(int i=head[u];i!=-1;i=e[i].nex){ 36 int v=e[i].v; 37 if(i==(id^1)) continue; 38 if(!pre[v]){ 39 s.push(i); 40 int lowv=dfs(v,i); 41 lowu=min(lowu,lowv); 42 if(lowv>pre[u]) ans1++; //割边 43 if(lowv>=pre[u]){ 44 bcc_cnt++; 45 bcc[bcc_cnt].clear(); 46 for(;;){ 47 int p=s.top(); 48 s.pop(); 49 bcc[bcc_cnt].push_back(p); 50 if(p==i) break; 51 } 52 } 53 } 54 else if(pre[v]
点双连通

 

转载于:https://www.cnblogs.com/yijiull/p/7390406.html

你可能感兴趣的文章
【Git】git clone与git pull区别
查看>>
【SVN】SVN的trunk、branches、tag的使用以及分支的概念
查看>>
JS闭包理解
查看>>
整数对题目
查看>>
php设计模式-观察者模式
查看>>
NFC技术:使用Android Beam技术传输文本(一)
查看>>
C++判断一个文件是否可以正确打开的代码
查看>>
unity 判断 是手机还是平板
查看>>
VisualStudio2015单步调试
查看>>
【进程资源】监视进程资源
查看>>
团队成员效绩评定
查看>>
【數據結構】哈工大實驗一:一元多项式(代碼以及報告)
查看>>
简单理解Socket
查看>>
Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)
查看>>
DHCP Option 60 认识
查看>>
浅析连续子向量,子数组和(一维,二维)问题
查看>>
C/C++中各种类型int、long、double、char表示范围(最大最小值)
查看>>
Linux环境下Eclipse + Tomcat + MySQL 配置J2EE开发环境的方法
查看>>
机器学习实战:第九章 树回归
查看>>
while(~scanf("%d %d",&a,&b))和while(scanf("%d %d",&a,&b)!=EOF)
查看>>