HDU 5811 Colosseo(拓扑排序+单调DP)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5811
【题目大意】
给出 一张单向图,现在将其划分成了两个部分,问划分之后的点是否分别满足按照一定序列排序后后面的点可以直接与前面的点相连,如果可以,从第二部分拆出几个点到第一部分仍然满足这个性质。
【题解】
对于第一问,我们可以拓扑排序判断,对于第二问,我们发现先在第一组的序列中找到第二组每个点的可插入位置,在第二组的位置序列中做最长不下降子序列就是答案。
【代码】
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
const int N=1005,M=40000000;
int n,m,mark[N],d[N],map[N][N],x,f[N][N],dp[N];
vector<int> T1,T2;
char file[M],*F=file;
void read(int&x){for(x=0;*F<48;F++);while(*F>47)x=x*10+*F++-48;}
bool Topological(int t,vector<int>&ret){
vector<int> v;
for(int i=0;i<n;i++){d[i]=0;if(mark[i]==t)v.push_back(i);}
for(int i=0;i<v.size();i++){
for(int j=0;j<v.size();j++){
if(map[v[i]][v[j]])d[v[i]]++;
}
}queue<int>Q;
for(int i=0;i<v.size();i++)if(!d[v[i]])Q.push(v[i]);
while(!Q.empty()){
int u=Q.front();Q.pop();
ret.push_back(u);
for(int i=0;i<v.size();i++){
if(map[v[i]][u]){
--d[v[i]];
if(!d[v[i]])Q.push(v[i]);
}
}
}if(ret.size()!=v.size())return 0;
return reverse(ret.begin(),ret.end()),1;
}
int main(){
fread(file,1,M,stdin);
while(1){
read(n);read(m);
if(m+n==0)return 0;
for(int i=0;i<n;i++)for(int j=0;j<n;j++)read(map[i][j]);
for(int i=0;i<n;i++)mark[i]=0;
for(int i=0;i<m;read(x),mark[--x]=1,i++);
T1.clear(); T2.clear();
if(!Topological(1,T1)||!Topological(0,T2)){
puts("NO");continue;
}int ans=0;
for(int i=0;i<T2.size();i++)f[m][i]=0;
for(int i=m-1;i>=0;i--){
for(int j=0;j<T2.size();j++)f[i][j]=f[i+1][j];
for(int j=0;j<T2.size();j++){
if(map[T1[i]][T2[j]])f[i][j]=1;
}
}
for(int i=0;i<T2.size();i++){
dp[i]=INT_MIN; int t=m;
for(int j=0;j<T1.size();j++){
if(map[T2[i]][T1[j]]){t=j;break;}
}if(f[t][i])continue;
dp[i]=1;
for(int j=0;j<i;j++){
if(!f[t][j])dp[i]=max(dp[i],dp[j]+1);
}ans=max(ans,dp[i]);
}printf("YES %d\n",ans);
}return 0;
}
HDU 5811 Colosseo(拓扑排序+单调DP)的更多相关文章
- HDU.2647 Reward(拓扑排序 TopSort)
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...
- [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)
题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...
- ACM: hdu 2647 Reward -拓扑排序
hdu 2647 Reward Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU 2647 Reward (拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- HDU 5811 Colosseo
首先判断一下两个集合是否能够拓扑排序,顺便记录下每个节点的拓扑序. 然后看T2中每个点在T1中能够放在哪一个位置,记录下这个位置Pi. 然后T2中(按拓扑序排好),计算Pi的一个非严格递增的LIS.L ...
- CF-721C DAG图拓扑排序+费用DP
比赛的时候写了个记忆化搜索,超时了. 后来学习了一下,这种题目应该用拓扑排序+DP来做. dp[][]保存走到[第i个节点][走过j个点]时所用的最短时间. pre[][]用前驱节点求路径 然后遍历一 ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing (拓扑排序+假dp)
题目链接:https://nanti.jisuanke.com/t/16957 题目: In this winter holiday, Bob has a plan for skiing at the ...
- 拓扑排序+数学+DP【洛谷P1685】 游览
P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...
随机推荐
- c语言 文件写入和读取
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10 struct studen ...
- 通过实例深入理解lec和yacc
本框架是一个lex/yacc完整的示例,包括详细的注释,用于学习lex/yacc程序基本的搭建方法,在linux/cygwin下敲入make就可以编译和执行.大部分框架已经搭好了,你只要稍加扩展就可以 ...
- Linux man 后面的数字含义及作用
Linux的man很强大,该手册分成很多section,使用man时可以指定不同的section来浏览,各个section意义如下: 1 Executable programs or shell co ...
- 非GUI-Qt程序运行后显示Console(简单好用)
----我的生活,我的点点滴滴!! 有很多时候,我们在程序中添加了好Debug信息,方便程序在运行期间打印出一些我们需要的信息或者,想用他来显示一些必要信息时, 那么console就太重要了,曾几何时 ...
- java中memcached
http://www.oschina.net/code/snippet_250396_9181
- JAVA的IO运用
IO OF JAVA想写好一篇关于JAVA的IO的文章不容易,因为它涉及的东西很多难以写得有深度和有思路.我虽不才但也写.这篇文章有我个人不少的见解,虽然涉足计算机不深但我不想用一大堆这个可能那个可能 ...
- Linux网络设备驱动架構學習(三)
Linux网络设备驱动架構學習(三) 接下來會從以下幾個方面介紹網絡設備驅動的編寫流程: 1.網絡設備的註冊與註銷 2.網絡設備的初始化 3.網絡設備的打開與釋放 4.網絡數據發送流程 5.網絡數據接 ...
- iOS提交AppStore后申请加急审核(转)
是的,由于最近知名的Xcode后门事件,我们的应用也被感染了.o(╯□╰)o 上周四从看到喵神的微博得知第三方Xcode可能被感染后马上查了下,自己用的却是被感染了,于是马上到MAS下载了最新的Xco ...
- Java入门基础总结(二)
判断语句 if else 如下: 1 /* 2 语法: 3 if(条件) 4 { 5 ...
- 依赖注入及AOP简述(十二)——依赖注入对象的行为增强(AOP) .
四.依赖注入对象的行为增强(AOP) 前面讲到,依赖注入框架的最鲜明的特点就是能够提供受容器管理的依赖对象,并且可以对对象提供行为增强(AOP)功能,所以这一章我们来讨论有关AOP的话题. 1. ...