```cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 2000000
using namespace std;
int qr,rq,head[maxn],he[maxn],ansz,ansf,r[maxn],c[maxn],n,m;
int cc[maxn],rr[maxn],rnum,cnum;
struct EDGE
{
int from;
int next;
int to;
}edge[maxn*2],e[maxn*2];
void add(int from,int to)
{
edge[++qr].next=head[from];
edge[qr].to=to;
head[from]=qr;
}
void aff(int from,int to)
{
e[++rq].next=he[from];
e[rq].from=from;
e[rq].to=to;
he[from]=rq;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
aff(b,a);
r[b]++;
c[a]++;
}
for(int i=1;i<=n;++i)
{
if(!r[i]) rr[++rnum]=i;
if(!c[i]) cc[++cnum]=i;
}
if(rnum==1)
{
ansz=1;
for(int i=head[rr[ansz]];i;i=edge[i].next)
{
int v=edge[i].to;
ansz++;
if(r[v]>1) break;
}
}
if(cnum==1)
{
ansf=1;
for(int i=he[cc[ansf]];i;i=e[i].next)
{
int v=e[i].to;
ansf++;
if(r[v]>1) break;
}
}
if(ansz==n&&ansf==n) printf("%d",ansz);
else printf("%d",ansz+ansf);
return 0;
}
```
by 睿屿青衫 @ 2017-10-22 07:15:51
今天有了一点思路,结果还是没处理好,20分
by 睿屿青衫 @ 2017-10-22 07:16:15
貌似还是错了==忽略了中间可能出现的情况
by 睿屿青衫 @ 2017-10-22 07:22:56