P8405 Naboj 题解

· · 题解

  1. 判环可以在拓扑排序中判定,不需要专门判断。

  2. 可能有人会疑惑我有环就无解这个结论只证明了充分性,可实际上后面构造方案时其实就相当于顺便证明了必要性。


#include<bits/stdc++.h>
using namespace std;

const int N=2e5+10,M=5e5+10;
int n,m,din[N],q[N];
int h[N],e[M],ne[M],idx;
vector<int> ans;
inline void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
inline bool topsort()
{
    int head=1,tail=0;
    for(int i=1;i<=n;i++)   if(!din[i]) q[++tail]=i;
    while(head<=tail)
    {
        int now=q[head++];
        for(int i=h[now];~i;i=ne[i])
        {
            din[e[i]]--;
            if(!din[e[i]])
            {
                q[++tail]=e[i];
                ans.push_back(e[i]);            
            }
        }
    }
    return tail==n;
}
int main()
{
    memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(v,u);din[u]++;
    }
    if(!topsort())  puts("-1");
    else    
    {
        printf("%d\n",(int)ans.size());
        for(auto now:ans)   printf("%d 1\n",now);
    }
    return 0;
}