Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed
题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方
思路:最少的的人能够走全然图 明显是最小路径覆盖问题 这里可能有环 所以要缩点 可是看例子又发现 一个强连通分量可能要拆分 n最大才15 所以就状态压缩
将全图分成一个个子状态 每一个子状态缩点 求最小路径覆盖 这样就攻克了一个强连通分量拆分的问题 最后状态压缩DP求解最优值
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
const int maxn = 16;
vector <int> G[maxn], G2[maxn];
int dp[1<<maxn];
int pre[maxn], low[maxn], sccno[maxn];
int clock, scc_cnt;
int n, m;
stack <int> S;
int a[maxn][maxn];
int b[maxn][maxn]; void dfs(int u, int x)
{
pre[u] = low[u] = ++clock;
S.push(u);
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(!(x&(1<<v)))
continue;
if(!pre[v])
{
dfs(v, x);
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;
}
}
}
int find_scc(int x)
{
memset(sccno, 0, sizeof(sccno));
memset(pre, 0, sizeof(pre));
scc_cnt = 0, clock = 0;
for(int i = 0; i < n; i++)
{
if(x&(1<<i) && !pre[i])
dfs(i, x);
}
return scc_cnt;
} int y[maxn];
bool vis[maxn]; bool xyl(int u)
{
for(int i = 0; i < G2[u].size(); i++)
{
int v = G2[u][i];
if(vis[v])
continue;
vis[v] = true;
if(y[v] == -1 || xyl(y[v]))
{
y[v] = u;
return true;
}
}
return false;
}
int match()
{
int ans = 0;
memset(y, -1, sizeof(y));
for(int i = 1; i <= scc_cnt; i++)
{
memset(vis, false, sizeof(vis));
if(xyl(i))
ans++;
}
return scc_cnt-ans;
}
int main()
{
int cas = 1;
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
G[i].clear();
memset(a, 0, sizeof(a));
while(m--)
{
int u, v;
scanf("%d %d", &u, &v);
u--;
v--;
G[u].push_back(v);
a[u][v] = 1;
}
dp[0] = 0;
//puts("sdf");
for(int i = 1; i < (1<<n); i++)
{
//memset(b, 0, sizeof(b));
find_scc(i);
for(int j = 0; j <= n; j++)
G2[j].clear();
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
if(a[j][k] && sccno[j] && sccno[k] && sccno[j] != sccno[k])
G2[sccno[j]].push_back(sccno[k]);
dp[i] = match();
}
//puts("sdf");
for(int s = 1; s < (1<<n); s++)
{
for(int i = s; i; i = s&(i-1))
{
dp[s] = min(dp[s], dp[s^i] + dp[i]);
}
}
printf("Case %d: %d\n", cas++, dp[(1<<n)-1]);
}
return 0;
}
Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖的更多相关文章
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- ASP.NET MVC:UrlHelper.cs
ylbtech-funcation-Utility: ASP.NET MVC:UrlHelper.cs 充当表示 ASP.NET Razor 页的类的基类. 1.UrlHelper 类返回顶部 1-1 ...
- Domino(群组工作软件)
ylbtech-Miscellaneos: Domino(群组工作软件) “Domino”是一种群组工作软件.使用了Domino的服务器就叫Domino服务器Domino的功能强大,界面丰富,主要用于 ...
- vRealize 7中部署blueprint如果失败,如何不让已经被provision的虚机被删掉?
正解为: _debug_deployment 哪里用: 参考资料 ========= Custom Properties for Naming and Analyzing Deployments ht ...
- iOS开发-Instruments性能调优
性能是苹果审核的一个很重要的部分,CPU,内存,图形绘制,存储空间和网络性能都是应用的重要的评估和组成部分.不管是作为个人应用开发者还是企业的开发人员,都需要遵循的一个原则是站在用户的角度去思考问题, ...
- Improve your code with lint checks
官方文档 使用 Lint 改进您的代码 [Improve your code with lint checks] 除了[In addition to]测试 Android 应用以确保其符合功能要求[m ...
- ListPopupWindow 列表弹窗 常见弹窗区别
案例 private void showPopupWindow(final Context context, @NonNull View anchorView) { final String[] po ...
- 【Kafka】Kafka为什么要加入分区的概念
Kafka为什么要加入分区的概念 kafka 分区 作用_百度搜索 (1 封私信)kafka中的topic为什么要进行分区? - 知乎 Kafka安装版本选择 Apache Kafka nc使用 n ...
- linux里tmpfs文件系统
linux里tmpfs文件系统 是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的Ramdisk,也不同于针对物理内存的Ramfs.Tmpfs可以使用物理内存,也可以使用交换分区. umoun ...
- DexHunter脱壳神器分析
0x00 这篇文章我们分析Android脱壳神器DexHunter的源码. DexHunter作者也写了一篇介绍它的文章从Android执行时出发.打造我们的脱壳神器.DexHunter源码位于htt ...
- 看见上帝的 10 个公式……
原文 Top Ten Greatest Equations Ever 本文内容 No.1 麦克斯韦方程组 No.2 欧拉方程 No.3 牛顿第二定律 No.4 毕达哥拉斯定理 No.5 薛定谔方程 N ...