Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
标题来源: problem=1406">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+强连通缩点+最小路径覆盖
题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...
- Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖
题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...
- P2172 [国家集训队]部落战争(最小路径覆盖)
P2172 [国家集训队]部落战争 每个点仅走一次:最小路径覆盖 套路地拆点,具体看代码中的$draw()$ 流量每增加1,意味着一支军队可以多走一格,代价减少1 最后答案即为总点数$-dinic() ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
- Light OJ 1032 - Fast Bit Calculations(数位DP)
题目大意: 一个数字把他看成二进制数字,数字里又会一些相邻的1,问从0到n至间所有相邻1的总和是多少? 分解成2进制数字,然后数位DP就行了. ======================== ...
- Light OJ 1025 - The Specials Menu(区间DP)
题目大意: 给你一个字符串,问有多少种方法删除字符,使得剩下的字符是回文串. 有几个规定: 1.空串不是回文串 2.剩下的字符位置不同也被视为不同的回文串.如:AA有三种回文串 A, A, A ...
- Light OJ 1011 - Marriage Ceremonies(状压DP)
题目大意: 有N个男人,和N个女人要互相匹配,每个男人和每个女人有个匹配值. 并且匹配只能是1对1的. 问所有人都匹配完成,最大的匹配值是多少? 状压DP,暴力枚举就OK了, 这个题目略坑,因为他 ...
- poj - 1170 - Shopping Offers(减少国家dp)
意甲冠军:b(0 <= b <= 5)商品的种类,每个人都有一个标签c(1 <= c <= 999),有需要购买若干k(1 <= k <=5),有一个单价p(1 & ...
- [ACM] hdu 5045 Contest (减少国家Dp)
Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...
随机推荐
- Wamp 访问本地站点慢 的解决办法
自从安装了64位的windows 8.1之后,电脑运行速度变快了,可是重新下载安装64位的WAMP,访问本地的WEB站点确是很慢,根本不像是在本地访问,经过在WAMP论坛上搜索,终于找到了解决办法,主 ...
- Visual Leak Detector(vld)无法显示内存泄露文件名称与行号
使用VLD測有没内存泄露的时候,出现(File and line number not available): (Function name unavailable) 查看VS控制台,发现 已载入&q ...
- UVA796- Critical Links(无向图中的桥梁)
题目链接 题意: 给出一个无向图,按顺序输出桥 思路:求出全部的桥,然后按顺序输出就可以 代码: #include <iostream> #include <cstdio> # ...
- Linux目录文件详解FHS标准(2013.09.05)
Linux 目录配置的依据FHS(Filesystem Hierarchy Standard)标准,将目录分成为四种交互作用的形态: 四种形态的具体解释: 可分享的:可以分享给其他系统挂载使用的目录, ...
- 断言Assert的使用
转载地址:http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏 ...
- 第1次实验——NPC问题(回溯算法、聚类分析)
题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一 ...
- linux管理员
sudo password 添加管理员用户,设置其密码. exit 退出管理员.
- Ice-2.1.2在RHEL Server 5.5上的安装
因为项目的需要,服务器上的程序需要使用Ice接口与其它程序通信,对方提供了一个Windows版的工程,我要把它移植到Linux服务器上,既然Ice是跨平台跨语言的中间件,想来移植不是很困难, ...
- ocx控件手动修改clsid的方法
替换掉工程的两个地方:IDL文件和CTRL文件. IMPLEMENT_OLECREATE_EX(CMultiwndCtrl, "MULTIWND.MultiwndCtrl.1", ...
- wIndows phone 7 解析Html数据
原文:wIndows phone 7 解析Html数据 在我的上一篇文章中我介绍了windows phone 7的gb2312解码, http://www.cnblogs.com/qingci/arc ...