Input
7 9
1 2
2 3
-1 5
2 6
5 1
-4 1
5 6
-6 7
-5 4
Output
2
Input
3 2
1 2
1 3
Output
3
题意:n个点,m条,边机器人从1出发,每组给出两个数a,b,当a是负数的时候是强制要走的,但一个机器人可能会出现bug,此时,他可以不按照红边走,但bug次数最多只能有一次,求机器人可能会停留的点数的个数。
用链式前向星:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#include <map> m
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int MAX=1e5+10;
struct Edge
{
int to;
int next;
}edge[MAX];
int cnt=1;
int head[MAX];
int hong[MAX];//接下来有没有红边,有就指向那个点,没有就是-1
int v[MAX];//标记能停留的点
int vh[MAX];//有红边的点有没有走过
void add(int a,int b)
{
edge[cnt].to=b;
edge[cnt].next=head[a];
head[a]=cnt;
cnt++;
}
void DFS(int a,int bug)
{
int i;
if(hong[a] == -1)
{
v[a]=1;
if(bug == 0)
return ;
else
{
for(i=head[a]; i!=-1; i=edge[i].next)
{
if(v[edge[i].to] != 1)
DFS(edge[i].to,0);
}
}
}
else
{
if(vh[a] == 1)
return ;
vh[a]=1;
if(bug == 0)
DFS(hong[a],0);
else
{
DFS(hong[a],1);
for(i=head[a]; i!=-1; i=edge[i].next)
{
if(v[edge[i].to] != 1)
DFS(edge[i].to,0);
}
}
}
return ;
}
int main()
{
int n,m,a,b,i;
scanf("%d %d",&n,&m);
memset(head,-1,sizeof(head));
memset(hong,-1,sizeof(hong));
memset(v,0,sizeof(v));
memset(vh,0,sizeof(vh));
for(i=0;i<m;i++)
{
cin>>a>>b;
if(a<0)
hong[-a]=b;
else
add(a,b);
}
int bug=1,sum=0;
DFS(1,1);
int ans=0;
for(i=1;i<=n;i++)
ans+=v[i];
cout<<ans<<endl;
return 0;
}