题意:有三台电脑,n个游戏,给出每个游戏在哪台电脑上完,并且给出哪些游戏必须在另外一些游戏之前玩,玩一个游戏要花1小时,换电脑也要花1小时,而且换电脑必须按1-2-3-1的顺序换,问如何才能花最少的时间玩完所有的游戏。
链接
思路:乍一看好像拓扑排序,但是又加了一个条件,每个游戏只能在指定的电脑玩,那就把这些电脑枚举一遍哪一个先开始选最少的就好了。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
int c[205],in[205],iin[205];
int n;
vector<int> v[205];
int bfs(int k){
queue<int> q[5];
for(int i=1;i<=n;i++){
if(in[i]==0){
q[c[i]].push(i);
}
}
for(int i=1;i<=n;i++){
iin[i]=in[i];
}
int step=-1;
while(!q[1].empty()||!q[2].empty()||!q[3].empty()){
step++;
while(!q[k].empty()){
int u=q[k].front();
q[k].pop();
step++;
for(int i=0;i<v[u].size();i++){
int vv=v[u][i];
iin[vv]--;
if(iin[vv]==0){
q[c[vv]].push(vv);
}
}
}
if(k==1)k=2;
else if(k==2)k=3;
else k=1;
}
if(step==-1)return 0;
else return step;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
}
int num,x;
memset(in,0,sizeof(in));
for(int i=1;i<=n;i++){
scanf("%d",&num);
while(num--){
scanf("%d",&x);
v[x].push_back(i);
in[i]++;
}
}
int ans=inf;
for(int i=1;i<=3;i++){
ans=min(ans,bfs(i));
}
printf("%d\n",ans);
return 0;
}