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 & ...
 
随机推荐
- 页面table的每行都有一个<input type='button' />,如何实现点击按钮在按钮下方弹出一个div,点击空白消失
			
\ <input id="test" type="button" />/*按钮*/ <div id="tanchu"> ...
 - JavaScript之菱形打印
			
很高兴来到博客园!迈入这座知识的殿堂,实是幸运.这是我的第一篇博客,开启丰富有趣的学习之旅,同时,我希望和大家一起学习一起进步,Let‘s go! <!DOCTYPE html PUBLIC & ...
 - 在sql-server上建立mysql链接库
			
EXEC sp_addlinkedserver @server = N'RESUME_MYSQL_CONN', @srvproduct=N'MySQL ODBC 5.1 Driver', @provi ...
 - 转:C#写的WEB服务器
			
转:http://www.cnblogs.com/x369/articles/79245.html 这只是一个简单的用C#写的WEB服务器,只实现了get方式的对html文件的请求,有兴趣的朋友可以在 ...
 - 你所不知道的html5与html中的那些事第三篇
			
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
 - 用宏定义封装LoadLibrary,方便的动态加载dll
			
同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数.最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方 ...
 - RedHat Install
			
1. 插入光盘1并从光盘启动加载镜像文件 2. 回车后进入安装流程 3. 选择语言 4. 选择键盘布局 5. 鼠标配置 6. 选择安装类型 7. 选择分区类型 8. 添加一个boot分区 9. 新建一 ...
 - 【学习笔记】【C语言】循环结构-do while
			
用法: while (条件) { } do { } while(条件); while和do-while的区别 1.很多情况下,while和do while可以互换 2.while特 ...
 - WPF DataGrid 操作列 类似 LinkButton
			
WPF中没有类似LinkButton,所以只有运用Button及样式来实现LinkButton. DataGrid 操作列 实现 多个类似LinkButton按钮: 具体实现代码如下: <Dat ...
 - javascript之正则表达式总结
			
了解RegExp类型: ECMAScript通过RegExp类型来支持正则表达式. var expression=/pattern/flags; 正则表达式的模式(pattern)部分: 可以是任何简 ...