hdu 3749 点双连通
来源:互联网 发布:表白网页源码下载 编辑:程序博客网 时间:2024/05/16 23:41
思路:点双连通。。先贴个代码,马上实验室锁门,下次详解吧
#include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<vector>using namespace std;struct query{ int num; int v;};struct edge{ int u,v;};stack<edge>st;vector<query>g[5005];int n,m,q;int du[1005],dv[1005];int block,num,scnum;int ans[1005];int fst[5005],next[20005],node[20005],en;int dfn[5005],low[5005];int d[5005];int b[5005];bool ve[20005];void init(){ en=0; block=0; num=0; scnum=0; memset(fst,-1,sizeof(fst)); memset(dfn,0,sizeof(dfn)); memset(ans,0,sizeof(ans)); memset(d,0,sizeof(d)); memset(ve,0,sizeof(ve)); for(int i=0;i<n;i++)g[i].clear();}void add(int u,int v){ next[en]=fst[u]; fst[u]=en; node[en]=v; en++;}void check(edge temp){ if(st.top().u==temp.u&&st.top().v==temp.v) { st.pop(); return; } scnum++; edge ed; do { ed=st.top(); st.pop(); d[ed.u]=scnum; d[ed.v]=scnum; int u=ed.u; int size=g[u].size(); for(int i=0;i<size;i++) { if(dfn[g[u][i].v]&&ans[g[u][i].num]==0) { if(d[u]==d[g[u][i].v]) { ans[g[u][i].num]=2; } } } }while((ed.u!=temp.u)||(ed.v!=temp.v));}void tarjan(int u,int r){ b[u]=block; dfn[u]=low[u]=++num; for(int i=fst[u];i!=-1;i=next[i]) { int v=node[i]; if(v==r||ve[i])continue; ve[i]=ve[i^1]=1; edge ed; ed.u=u; ed.v=v; st.push(ed); if(!dfn[v]) { tarjan(v,u); low[u]=min(low[u],low[v]); if(dfn[u]<=low[v]) { check(ed); } } else low[u]=min(low[u],dfn[v]); }}int main(){ int ca=1; int u,v; while(scanf("%d%d%d",&n,&m,&q)) { if(n==0&&m==0&&q==0)break; init(); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); add(u,v); add(v,u); } for(int i=0;i<q;i++) { scanf("%d%d",&u,&v); du[i]=u; dv[i]=v; query qq; qq.num=i; qq.v=v; g[u].push_back(qq); qq.v=u; g[v].push_back(qq); } for(int i=0;i<n;i++) { ++block; if(!dfn[i])tarjan(i,-1); } cout<<"Case "<<ca++<<":"<<endl; for(int i=0;i<q;i++) { if(ans[i]==2)cout<<"two or more"<<endl; else { if(b[du[i]]==b[dv[i]]) { cout<<"one"<<endl; } else cout<<"zero"<<endl; } } } return 0;}/*5 6 100 10 21 22 32 43 40 10 20 30 41 21 31 42 32 43 4*/
- hdu 3749 点双连通
- hdu 3394(点双连通)
- hdu 5739(点双连通)
- HDU 5739(点双连通)
- hdu 3749 点双连通分量
- HDU 5739 (点双连通 树DP)
- HDU 5409 双连通缩点
- HDU 3749 Financial Crisis 点双连通分量
- HDU 3749 Financial Crisis(点-双连通分量)
- HDU-3749(点双连通分量-并查集)
- HDU 3749(点双连通分量-并查集)
- HDU 3749 Financial Crisis 点双连通分量
- HDU 3749 Financial Crisis(点-双连通分量)
- hdu 3749 Financial Crisis(Tarjan,点双连通分量)
- HDU 3749 Financial Crisis (点双连通分量)
- hdu - 4338 - Simple Path - 割点 && 双连通
- HDU 4338 Simple Path 点双连通+lca
- HDU -- 3844 Mining Your Own Business(点双连通)
- 基于MINA实现server端心跳检测(KeepAliveFilter)
- 深入理解C++的动态绑定和静态绑定
- chromium设置字体大小功能
- uva 11218 KTV
- ios本地化系统文字的方法,比如键盘的send本地化为发送
- hdu 3749 点双连通
- 80C51 单片机 蜂鸣器
- 工作那些事(十六)面试时,面试官喜欢的非技术问题汇总
- [JAVA软件工程师-面试宝典-2013最新版]
- CRM管理:邮件营销大学问
- ant的配置(二)创建文件并编译、删除文件、生成jar包和run设置
- extern用法详解
- 百度阅读
- 目录索引