C/C++教程

Game CodeForces - 213A

本文主要是介绍Game CodeForces - 213A,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

原题链接
考察:拓扑排序,思维
思路:  2-->1的时间等同于1-->2--->3的时间,也就是说往回走与正向走耗时相同.说明我们可以按1-->2-->3--->1的顺序走即可.枚举起点,再用拓扑排序算时间

Code

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 210;
int n,c[N],h[N],idx,d[N],back[N];
struct Road{
	int to,ne;
}road[N*N];
void add(int a,int b)
{
	road[idx].to = b,road[idx].ne = h[a],h[a] = idx++;
}
int bfs(int k)
{
	queue<int> q[4];
	int ans = 0;
	memcpy(back,d,sizeof d);
	for(int i=1;i<=n;i++)
	  if(!d[i]) q[c[i]].push(i);
	while(q[1].size()||q[2].size()||q[3].size())
	{
		while(q[k].size())
		{
			int u = q[k].front();
			q[k].pop();
			ans++;
			for(int i=h[u];~i;i=road[i].ne)
			{
				int v = road[i].to;
				if(--d[v]==0) q[c[v]].push(v);
			}
		}
		k = k%3+1;
		ans++;
	}
	for(int i=1;i<=n;i++)
	  if(d[i]) ans = 0x3f3f3f3f;
	memcpy(d,back,sizeof d);
	return ans-1;
}
int main()
{
	scanf("%d",&n);
	memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
	for(int i=1,k,j;i<=n;i++)
	{
		scanf("%d",&k);
		while(k--)
		{
			scanf("%d",&j);
			add(j,i);
			d[i]++;
		}
	}
	int res = 0x3f3f3f3f;
	for(int i=1;i<=3;i++) res = min(bfs(i),res);
	printf("%d\n",res);
	return 0;
}
这篇关于Game CodeForces - 213A的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!