Problem 1014 xxx游戏 暴力+拓扑排序
题目链接:
题目
Problem 1014 xxx游戏
Time Limit: 1000 mSec
Memory Limit : 32768 KB
问题描述
小M最近很喜欢玩XXX游戏。这个游戏很简单,仅由3个场景(分别为1、2、3)构成构成,只存在1->2、2->3、3->1的路径,三条路径的时间花费都是1个小时。
由于剧情需要,这个游戏有N个剧情任务,每个剧情任务在其中一个场景中完成,但是某些剧情的触发前提是一些必要剧情任务已经完成。为了简化问题,每个剧情任务都只需要一个小时就可以完成。
小M想要花最少的时间通关,然而他还有很多考试,所以请你计算出通关所需要的最少时间。
一开始,你可以选择1、2、3其中一个场景开始做任务。
输入
第一行为整数T(T<=20),表示测试数据组数。
每组数据的第一行为整数N(N<=200),表示剧情数。
第二行包含N个整数Ci(1<=Ci<=3),表示第i个剧情需要在场景Ci中完成。
接下来N行,每行包含一个整数t(0<=t<=N-1),表示做剧情任务i前需要先完成t个剧情任务。然后是t个不同的整数Aij(1<=Aij<=N),表示剧情编号。
题目保证不会出现相互依赖的情况,即不出现环。
输出
最少时间数。
样例
input
2
1
1
0
5
2 2 1 1 3
1 5
2 5 1
2 5 4
1 5
0
output
1
7
题解
每个场景开一个队列保存入度为0的点,枚举开始的场景,然后拓扑排序模拟,贪心把当前场景能完成的任务都完成。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef __int64 LL;
const int maxn=222;
const LL INF=0x3f3f3f3f3f3f3f3fLL;
vector<int> arr[3],G[maxn];
queue<int> Q[3];
int in[maxn],id[maxn],used[maxn];
int n;
int inn[maxn];
LL solve(int st){
LL ret=0,cnt=0;
for(int i=0;i<maxn;i++) inn[i]=in[i];
for(int i=0;i<3;i++){
while(!Q[i].empty()) Q[i].pop();
}
for(int now=0;now<3;now++){
for(int i=0;i<arr[now].size();i++){
int v=arr[now][i];
if(inn[v]==0) Q[now].push(v);
}
}
for(int now=st;;now=(now+1)%3){
while(!Q[now].empty()){
int u=Q[now].front(); Q[now].pop();
ret++; cnt++;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
inn[v]--;
if(inn[v]==0) Q[id[v]].push(v);
}
}
if(Q[0].empty()&&Q[1].empty()&&Q[2].empty()) break;
ret++;
}
return ret;
}
void init(){
memset(in,0,sizeof(in));
for(int i=0;i<maxn;i++) G[i].clear();
for(int i=0;i<3;i++) arr[i].clear();
}
int main(){
int tc;
scanf("%d",&tc);
while(tc--){
init();
scanf("%d",&n);
for(int i=0;i<n;i++){
int x; scanf("%d",&x),x--;
arr[x].push_back(i);
id[i]=x;
}
for(int i=0;i<n;i++){
int cnt; scanf("%d",&cnt);
while(cnt--){
int x; scanf("%d",&x),x--;
G[x].push_back(i);
in[i]++;
}
}
LL ans=INF;
for(int i=0;i<3;i++){
ans=min(ans,solve(i));
}
printf("%I64d\n",ans);
}
return 0;
}
Problem 1014 xxx游戏 暴力+拓扑排序的更多相关文章
- FZU xxx游戏(拓扑排序+暴力)
xxx游戏 Time Limit: 1000MS Memory Limit: 32768 KB Description 小M最近很喜欢玩XXX游戏.这个游戏很简单,仅由3个场景(分别为1.2. ...
- 【BZOJ5288】[HNOI2018]游戏(拓扑排序)
[BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...
- Codeforces Gym-102219 2019 ICPC Malaysia National J. Kitchen Plates (暴力,拓扑排序)
题意:给你5个\(A,B,C,D,E\)大小关系式,升序输出它们,如果所给的大小矛盾,输出\(impossible\). 题意:当时第一眼想到的就是连边然后排序,很明显是拓扑排序(然而我不会qwq,之 ...
- BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序
http://uoj.ac/problem/317 https://www.lydsy.com/JudgeOnline/problem.php?id=4945 我现在的程序uoj的额外数据通过不了,b ...
- BZOJ4383 Pustynia(线段树+拓扑排序)
线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...
- CF-825E Minimal Labels 反向拓扑排序
http://codeforces.com/contest/825/problem/E 一道裸的拓扑排序题.为什么需要反向拓扑排序呢?因为一条大下标指向小下标的边可能会导致小下标更晚分配到号码,导致字 ...
- LightOJ1003---Drunk(拓扑排序判环)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- Problem UVA1572-Self-Assembly(拓扑排序)
Problem UVA1572-Self-Assembly Accept: 196 Submit: 1152 Time Limit: 3000 mSec Problem Description Au ...
- ACM: poj 1094 Sorting It All Out - 拓扑排序
poj 1094 Sorting It All Out Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & ...
随机推荐
- ASP.NET Ajax核心对象
本章学习目标 主要掌握AJAX的基本概念和实现机制,学习并创建XMLHttpRequest对象,使用XMLHttpRequestObject对象获取服务器端的数据 主要内容如下,请点击ASP.NET ...
- UI4_UIWebView
// // ViewController.m // UI4_UIWebView // // Created by zhangxueming on 15/7/7. // Copyright (c) 20 ...
- python基础day2作业:购物车
#功能:1.可注册账号2.登录买家账号3.可查询编辑购物车里商品4.可以余额充值5.可提示余额不足6.购物车结算 #使用:1.第一次使用先注册账号填写账号金额2.账号金额信息保存在buyer_acco ...
- 最新13个加速 Web 开发的框架和工具
我们为开发人员挑选了15个最新的Web开发框架,你肯定尝试一下这些新鲜的框架,有的可能略微复杂,有的提供了很多的配置选项,也有一些窗口小部件和界面交互的选择.他们将帮助你创建更优秀的网站,提供给用户更 ...
- 10款基于jquery的web前端特效及源码下载
1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...
- 8款超酷体验的jQuery/CSS3应用插件
1.jQuery/CSS3实现Android Dock菜单效果 这是一款基于jQuery和CSS3的Android Dock菜单效果,点击底部的按钮即可让应用图标浮动上来,并且按钮也出现3D的翻转效果 ...
- CP30 ---DataSource连接池的创建过程
1.参看CP30文档quickStart 如下具体创建步骤 public DataSource getDs() throws Exception { //创建连接池对象 ComboPooledData ...
- IC卡的逻辑卡号和市民卡卡号
CPU卡,IC卡等的卡号与卡在出厂时的卡号.
- linux 编译内核[scripts/kconfig/dochecklxdialog] 错误
administrator@ubuntu:~/linux-2.6.28-omap$ make menuconfig *** Unable to find the ncurses libraries o ...
- flex基础学习
Flex是Adobe开发的一种RIA,富互联网应用,用Flex开发的东西都可以使用Flash做出来,但是Flex主要是面向的程序开发人员,前台使用ActionScript和MXML. 上面介绍了fle ...