Light OJ 1429 - Assassin`s Creed (II)
来源:互联网 发布:造价师做题软件 编辑:程序博客网 时间:2024/04/29 06:13
与 POJ 2594 类似,只不过这里给的是一个有环的图!还有每个人可以走重复的点,任意访问多次都行,只要可达即可。
解法也类似,只不过这里先要缩点,因为同一个强连通分量内的点都相互可达嘛,所以直接缩点就好了!
代码:
#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <stack>using namespace std;const int maxn = 1010;int vis[maxn];int y[maxn];vector <int> G[maxn], G2[maxn], G3[maxn];int n, m;int a[maxn][maxn];int pre[maxn];int low[maxn];int sccno[maxn];int dfs_clock;int scc_cnt;stack <int> S;void dfs(int u){ pre[u] = low[u] = ++dfs_clock; S.push(u); for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(!pre[v]) { dfs(v); low[u] = min(low[u], low[v]); } else if(!sccno[v]) low[u] = min(low[u], pre[v]); } if(pre[u] == low[u]) { scc_cnt++; while(1) { int x = S.top(); S.pop(); sccno[x] = scc_cnt; if(x == u) break; } }}void find_scc(){ dfs_clock = scc_cnt = 0; memset(sccno, 0, sizeof(sccno)); memset(pre, 0, sizeof(pre)); for(int i = 1; i <= n; i++) if(!pre[i]) dfs(i);}void DFS(int now,int u){ vis[u] = 1; for(int i = 0;i < G2[u].size();i ++){ int v = G2[u][i]; if(!vis[v]) { G[now].push_back(v); DFS(now, v); } }}bool dfs2(int u){ for(int i = 0; i < G3[u].size(); i++) { int v = G3[u][i]; if(vis[v]) continue; vis[v] = true; if(y[v] == -1 || dfs2(y[v])) { y[v] = u; return true; } } return false;}int hungary(){ int ans = 0; memset(y, -1, sizeof(y)); for(int i = 1; i <= scc_cnt; i++) { memset(vis, 0, sizeof(vis)); if(dfs2(i)) ans++; } return ans;}int main(){ int T, ca = 0; scanf("%d", &T); while(T--) { scanf("%d %d", &n, &m); for(int i = 0; i <= n; i++) G[i].clear(), G2[i].clear(), G3[i].clear(); while(m--) { int u, v; scanf("%d %d", &u, &v); G2[u].push_back(v); } for(int i = 1; i <= n; i++){ memset(vis, 0, sizeof(vis)); DFS(i,i); } find_scc(); for(int u = 1; u <= n; u++) { for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(sccno[u] != sccno[v]) G3[sccno[u]].push_back(sccno[v]); } } printf("Case %d: %d\n", ++ca, scc_cnt - hungary()); } return 0;}
0 0
- Light OJ 1429 - Assassin`s Creed (II)
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
- Light OJ 1402 Assassin`s Creed (状压DP)
- lightoj 1429 - Assassin`s Creed (II)
- LightOJ - 1429 Assassin`s Creed (II)(二分图)
- Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
- 【最小路径覆盖】Assassin`s Creed (II)
- hdu4415 Assassin’s Creed
- hdu4415 Assassin’s Creed
- F - Assassin’s Creed
- hdu4415 Assassin's Creed
- hdu4415 Assassin’s Creed
- 【贪心】 hdu4415 Assassin’s Creed
- hdu-4415-Assassin’s Creed
- hdu 4415 Assassin’s Creed
- HDU 4415 Assassin’s Creed
- hdu4415 Assassin’s Creed (贪心)
- hdu 4415 Assassin’s Creed
- 几番周折后的稳定
- hdu1213 并查集
- [IOS开发教程] NSfileManager的使用方法
- 汇编实现“比较三个数,取中间”
- 【郑轻】[1781]和尚特烦恼7——念经
- Light OJ 1429 - Assassin`s Creed (II)
- iOS中判断数组长度问题
- MySQL服务在windows系统中修改Data路径后无法启动问题解决
- ZOJ 1298_Domino Effect
- automake生成makefile学习
- Android通过Mainfest设置Theme实现布局全屏
- 怎么跳出for循环?
- 23种设计模式(2)_创建型_工厂方法模式(Factory Method Pattern)
- iOS开发怎么在Button的显示倒计时