【动态规划】【缩点】NCPC 2014 G Outing
题目链接:
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1793
题目大意:
一辆公交车,上面M个座位,N个人(M<=N<=1000),每个人只有在Ci也上车的情况下才上车。问最多上车几人。
题目思路:
【动态规划】【缩点】
首先这是一张N个点N条边的有向图。如果J在I也上车的情况下才上车则连一条I到J的边。这样每个点入度最多为1.
这张图有可能有环,所以先缩点,缩完点之后每个环不会有入边,且一定是一个子树的根节点。这样原来的有环的图就变成若干颗树。
而每个树都有取值的上下界[A,B]A为环的大小,B为这棵树的大小(只取环上的人上车,或者再一个一个加上链上的人)
那么问题就变成K个有取值范围的背包。问容量不超过M最大能取到多少值。
三方枚举,f[i][j]表示前I个容量为J的状态能否达到,根据当前取值范围[A,B]转移。
//
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-8)
#define J 10
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#define N 1004
using namespace std;
typedef long long LL;
int cas,cass;
int n,m,lll,ans;
int fa[N],pre[N],num[N],e[N],t[N],last[N],in[N],q[N];
bool f[N][N];
bool u[N];
struct xxx
{
int next,to;
}a[N];
void cover(int x)
{
int i=e[x];
fa[x]=x;
num[x]=;
while(i!=x)
{
num[x]++;
num[i]=;
fa[i]=x;
i=e[i];
}
}
void dfs(int u)
{
if(t[u])
{
if(t[u]>cass)cover(u);
return;
}
t[u]=++cas;
//fa[u]=e[u];
dfs(e[u]);
}
void add(int x,int y)
{
a[++lll].next=last[x];
a[lll].to=y;
last[x]=lll;
}
int work(int now)
{
int i,to,sum=;
for(i=last[now];i;i=a[i].next)
{
to=a[i].to;
sum+=work(to);
}
return sum+num[now];
}
void spfa()
{
int i,l=,r=,now,to;
mem(u,);cas=;
for(i=;i<=n;i++)
if(!in[i] && num[i])q[++cas]=i,pre[i]=work(i);
} int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z;
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s+1))
while(~scanf("%d",&n))
{
lll=;mem(num,);mem(t,);mem(in,);mem(last,);mem(pre,);mem(f,);
scanf("%d",&m);
for(i=;i<=n;i++)
{
scanf("%d",&e[i]);
num[i]=;fa[i]=i;
}
cas=;
for(i=;i<=n;i++)
{
if(t[i])continue;
cass=cas;
dfs(i);
}
for(i=;i<=n;i++)
{
if(num[i]== || fa[e[i]]==i)continue;
add(fa[e[i]],i);
in[i]++;
}
spfa();
f[][]=;
for(i=;i<=cas;i++)
{
x=q[i];y=q[i-];
for(j=;j<=m;j++)
{
f[x][j]|=f[y][j];
for(k=num[x];k<=pre[x] && j+k<=m;k++)
f[x][j+k]|=f[y][j];
}
}
x=q[cas];
for(i=m;i;i--)
if(f[x][i])break;
printf("%d\n",i);
}
return ;
}
/*
// //
*/
【动态规划】【缩点】NCPC 2014 G Outing的更多相关文章
- 数据结构(虚树,动态规划):HNOI 2014 世界树
Hnoi2014 世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平 ...
- Nordic Collegiate Programming Contest NCPC 2017-Problem G Galactic Collegiate Programming Contest
题目大意:有n( n<1e5 )只队伍参加程序竞赛,然后给m个信息,每个信息告诉你第p 个队伍过了一题,并且告诉你罚时是多少,让你输入每个信息之后,第一个队伍的 排名. 思路:一眼看过去就像数据 ...
- 【高精度】NCPC 2014 C catalansqure
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1789 题目大意: 求大卡特兰数..公式如下.输入n求Sn(n<=5000) 题目 ...
- 【KMP】【最小表示法】NCPC 2014 H clock pictures
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...
- 【图论】【宽搜】【染色】NCPC 2014 A Ades
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1787 题目大意: N个点M条无向边(N,M<=200000),一个节点只能有一个 ...
- 【模拟】NCPC 2014 E ceremony
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1791 题目大意: N栋大楼(N<=100000),拆除的时候有两种选择的操作,可 ...
- 【模拟】NCPC 2014 D Dice Game
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1790 题目大意: 两个人,每个人有两个骰子,每个骰子可以等概率取[a,b],问哪个人两 ...
- 【模拟】NCPC 2014 K Train passengers
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1797 题目大意: 有N个车站,火车一共可以坐M个人,每个车站下车Ai,上车Bi个人,在 ...
- 公司outing选项
Sign up: 2014 Summer Outing 请您从以下三个方案中选择您最感兴趣的一个项目, 如果您不能参加此次summer outing, 请选择"遗憾放弃"- ...
随机推荐
- Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 中文帮助文档 分类: ASP.NET 2014-10-28 14:09 177人阅读 评论(1) 收藏
下载地址1:https://securityswitch.googlecode.com/files/SecuritySwitch%20v4.2.0.0%20-%20Binary.zip 下载地址2:h ...
- ASP.NET如何发布更新
如果一个应用程序迭代开发后,我们如何来进行发布更新呢? 这里,我用Visual Studio 2008和SQL server来演示. 一.程序修改完毕后,我们要进行以下操作: 1.1 点击解决方案,重 ...
- 【转】iOS-Core-Animation-Advanced-Techniques(六)
原文:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇 ...
- 简单高效读写修改整个文本Slurp
语法: use File::Slurp; #标量环境下一次读取所有文本内容到标量中. my $text = read_file( 'filename' ) ; # 读取文本的所有行到数组中. my ...
- 『重构--改善既有代码的设计』读书笔记----Replace Data Value with Object
当你在一个类中使用字段的时候,发现这个字段必须要和其他数据或者行为一起使用才有意义.你就应该考虑把这个数据项改成对象.在开发初期,我们对于新类中的字段往往会采取简单的基本类型形式来保存,但随着我们开发 ...
- c++ undefined reference to mysqlinit
Solved g++ $(mysql_config --cflags) file.cpp -o filename $(mysql_config --libs)
- .NET Framework(二)
在上一篇的随笔中,我们在理论层面上大致说明了.NET Framework的工作机制,内容的确比较晦涩难懂,但是还是希望大家有时候可以看看.我个人觉得,编程不是一味的敲代码,当自己遇到瓶颈的时候,可以多 ...
- Sublime text3 JS语法检测工具安装及使用
Sublime text3 JS语法检测工具安装及使用 工具/原料 sublime text3 nodejs sublimeLinter sublimeLinter-jshint 方法/步骤 首先ct ...
- Android JNI和NDK关系
1.什么JNI Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机(VM) ...
- js以json形式提交数据,后台接受
$("#savename").click(function(){ var fananname=$("#editname").val(); var jsonLis ...