题目链接:

题目

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游戏 暴力+拓扑排序的更多相关文章

  1. FZU xxx游戏(拓扑排序+暴力)

    xxx游戏 Time Limit: 1000MS     Memory Limit: 32768 KB Description 小M最近很喜欢玩XXX游戏.这个游戏很简单,仅由3个场景(分别为1.2. ...

  2. 【BZOJ5288】[HNOI2018]游戏(拓扑排序)

    [BZOJ5288][HNOI2018]游戏(拓扑排序) 题面 BZOJ 洛谷 题解 去年省选的时候这题给我乱搞整过去整过去了,也是虐心了.... 所以当然是来讲正儿八经的正确做法啦. 很明显,我们需 ...

  3. Codeforces Gym-102219 2019 ICPC Malaysia National J. Kitchen Plates (暴力,拓扑排序)

    题意:给你5个\(A,B,C,D,E\)大小关系式,升序输出它们,如果所给的大小矛盾,输出\(impossible\). 题意:当时第一眼想到的就是连边然后排序,很明显是拓扑排序(然而我不会qwq,之 ...

  4. BZOJ 4945 UOJ #317 NOI2017 游戏 2-SAT 拓扑排序

    http://uoj.ac/problem/317 https://www.lydsy.com/JudgeOnline/problem.php?id=4945 我现在的程序uoj的额外数据通过不了,b ...

  5. BZOJ4383 Pustynia(线段树+拓扑排序)

    线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...

  6. CF-825E Minimal Labels 反向拓扑排序

    http://codeforces.com/contest/825/problem/E 一道裸的拓扑排序题.为什么需要反向拓扑排序呢?因为一条大下标指向小下标的边可能会导致小下标更晚分配到号码,导致字 ...

  7. LightOJ1003---Drunk(拓扑排序判环)

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  8. Problem UVA1572-Self-Assembly(拓扑排序)

    Problem UVA1572-Self-Assembly Accept: 196  Submit: 1152 Time Limit: 3000 mSec Problem Description Au ...

  9. ACM: poj 1094 Sorting It All Out - 拓扑排序

    poj 1094 Sorting It All Out Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & ...

随机推荐

  1. postfix部署多个Content Filter的方法

    Postfix邮件服务器可以在接收邮件时使用content_filter来扫描邮件(病毒,广告等).通过整合一个集中化的电子邮件内容过滤器,比如amavis或mailscanner,Postfix可以 ...

  2. 清除windows的EFS加密

        所使用软件为aefsdr_setup_en,搜索名为advanced.efs.data.recovery   1.         创建需要加密的文件   2.         进行加密   ...

  3. HTML+CSS学习笔记 (15) - css样式设置小技巧

    水平居中设置-行内元素 我们在实际工作中常会遇到需要设置水平居中场景,今天我们就来看看怎么设置水平居中的. 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:c ...

  4. C语言知识总结(2)

    选择结构-if if(表达式) {} {}为作用域 多重if-else  例如: #include <stdio.h> int main(){ ; ){ printf("没有购物 ...

  5. Java longTime 和C#日期转换(结构+运算符重载)

    前几天,因为工作原因,连到了公司的一个java系统.查看数据的时候,突然整个人都不好了,数据库中日期字段时间为毛都是整型?之前从来没有接触过java,所心就趁机了解了一下.原来,在数据库中,保存的是j ...

  6. 分享web前端七款HTML5 Loading动画特效集锦

    以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...

  7. 2_1我的第一个应用hello world[wp8特色开发与编程技巧]

    2_1hello world -5min 大家好,我是徐文康,在上一个视频当中我们已经讲了,如何根据自己电脑系统去下载相应的SDK. 你可能花了很多时间去安装以及配置好了这个开发环境,如果还没有配置好 ...

  8. VIM中的寄存器简介

    原来在vim粘贴从其他地方复制过来的文本的时候,一直用的shift + inert,那时就想,能不能够直接就像p那样粘贴,不必非得进入插入模式再来粘贴.后来看了<vim实用技巧>上关于vi ...

  9. ADO.NET基本操作(CRUD、Procedure、Transaction)

    模型沿用上篇博客所提到的学生.教师.课程,以详细的代码进行演示. 增删改查 添加学生.教师.课程 using System.Data.SqlClient; namespace Test { class ...

  10. javascript 创建对象及对象原型链属性介绍

    我们知道javascript里定义一个普通对象的方法,如: let obj = {}; obj.num = 1; obj.string = 'string'; obj.func = function( ...