这个题想了好久才做出来,对于我来说比较麻烦。
题意就不说了。。。
思路,首先,要明白机器人可能不发生跳跃,也可能发生;
开了一个结构体数组,red数组表示这个点强制走到的下一个点,black数组表示发生故障时这个点可跳跃的点,用dfs遍历black的点和red的点,redsum=0时,此点可能是机器人要停的点,标记。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#define mod 20123
#define inf 123456789
#define LL long long
#define big 1e18
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int max(int a,int b){ return a>b?a:b;}
int maxn (int a,int b,int c){return max(max(a,b),max(b,c));}
LL min(LL a,LL b){return a<b?a:b;}
struct node{
int red[1005];
int black[1005];
int redsum,blacksum;
}num[1005];
int dis[1005],vis[1005];
void init()
{
for(int i=0;i<=1001;i++)
num[i].redsum=num[i].blacksum=0;
}
void dfs(int x,int nu,int con)
{
if(nu==1){
if(num[x].redsum==0) {dis[x]=2;return; }
else{
for(int i=0;i<num[x].redsum;i++)
{
if(vis[num[x].red[i]]==1){continue;}
vis[num[x].red[i]]=1;
dfs(num[x].red[i],nu,con);
vis[num[x].red[i]]=0;
}
}
}
else {
if(num[x].redsum==0) {dis[x]=2;}
else {
for(int i=0;i<num[x].redsum;i++)
{
if(vis[num[x].red[i]]==1){continue;}
vis[num[x].red[i]]=1;
dfs(num[x].red[i],nu,con);
vis[num[x].red[i]]=0;
}
}
for(int i=0;i<num[x].blacksum;i++)
{
if(vis[num[x].black[i]]==0){
vis[num[x].black[i]]=1;
nu++;
dfs(num[x].black[i],nu,con);
nu--;
vis[num[x].black[i]]=0;}
}
}
}
int main()
{
int n,m,i,j;
int sum=0;
scanf("%d%d",&n,&m);
init();
mem(vis,0);
mem(dis,0);
for(i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(x<0){
num[-x].red[num[-x].redsum]=y;
num[-x].redsum++;
}
else {
num[x].black[num[x].blacksum]=y;
num[x].blacksum++;
}
}
if(num[1].redsum==0) dis[1]=2;
for(i=0;i<num[1].blacksum;i++){
vis[num[1].black[i]]=1;
dfs(num[1].black[i],1,num[1].black[i]);
vis[num[1].black[i]]=0;
}
for(i=0;i<num[1].redsum;i++)
{
vis[num[1].red[i]]=1;
dfs(num[1].red[i],0,num[1].red[i]);
vis[num[1].red[i]]=0;
}
for(i=1;i<=n;i++)
if(dis[i]==2) sum++;
printf("%d\n",sum);
return 0;
}