中石油——5094— Faulty Robot(dfs)

这个题想了好久才做出来,对于我来说比较麻烦。

题意就不说了。。。

思路,首先,要明白机器人可能不发生跳跃,也可能发生;

开了一个结构体数组,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;
}

猜你喜欢

转载自blog.csdn.net/qq_41485193/article/details/80066695