lightoj 1003 强联通模板题
2013-11-10 21:34
204 查看
#include<stdio.h> #include<vector> #include<algorithm> #include<map> #include<string> #include<iostream> #include<string.h> using namespace std; map<string,int> mp; vector<int> topo; vector<int> G[12000]; vector<int> rG[12000]; int cmp[20000]; int num_kind=0; int used[20000]; void dfs(int n) { used =1; for(int i=0;i<G .size();i++) { int v=G [i]; if(!used[v]) dfs(v); } topo.push_back(n); } void rdfs(int n,int k) { used =1; for(int i=0;i<rG .size();i++) { int v=rG [i]; if(!used[v]) rdfs(v,k); } cmp =k; } int scc() { memset(used,0,sizeof(used)); topo.clear(); for(int i=0;i<num_kind;i++) { if(!used[i]) dfs(i); } memset(used,0,sizeof(used)); int k=0; for(int i=num_kind-1;i>=0;i--) { int v=topo[i]; if(!used[v]) rdfs(v,k++); } return k; } int main() { int cas; scanf("%d",&cas); for(int T=1;T<=cas;T++) { num_kind=0; memset(G,0,sizeof(G)); memset(rG,0,sizeof(rG)); mp.clear(); int n; scanf("%d",&n); for(int i=0;i<n;i++) { string from,to; cin>>from>>to; if(mp.find(from)==mp.end()) { mp[from]=num_kind++; } if(mp.find(to)==mp.end()) { mp[to]=num_kind++; } if(mp[from]!=mp[to]) { G[mp[from]].push_back(mp[to]); rG[mp[to]].push_back(mp[from]); } } int k=scc(); if(k==num_kind) printf("Case %d: Yes\n",T); else printf("Case %d: No\n",T); } }
相关文章推荐
- poj 2117 Electricity 求无向图中去掉一个点后最大的联通分支数 无向图有可能不联通 tarjan求割点模板
- lightoj 1003
- LightOJ - 1003 Drunk
- Aladdin and the Flying Carpet LightOJ - 1341 唯一分解/数论/合数分解模板
- 畅联通工程续(最短路 算法模板。。。)
- 点双联通和二分图着色(二分图判定)模板
- LightOJ1214 - Large Division(高精度取模 + 模板)
- lightoj 1003
- lightoj 1096【矩阵快速幂(作为以后的模板)】
- LightOJ - 1319 Monkey Tradition (中国剩余定理 模板)
- Proving Equivalences 判断至少加几个边可以变成强联通图+很好的模板
- LightOJ - 1076 Get the Containers (二分)模板题
- lightoj 1300 边双联通分量+交叉染色求奇圈
- Lightoj 1003 - Drunk(拓扑排序)
- poj 2117 去掉割点可以分得的联通图的个数模板
- lightoj 1210 最少加边,使得图变成强联通
- 强联通分量 Tarjan算法 模板
- Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)
- lightoj 1003
- 割点,割桥,双联通模板总结