http://oj.luogu.org:8888/problemshow.php?pid=1992

水题,yes和no大小写的问题wa了10分钟没看出来,果然该去睡觉了。。

问图是否存在环,标号法,dfs把所有点搜一遍,方法见白书P111拓扑排序

感觉他们这题出的真逗,最后还乱入个快速幂,OTZ

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
typedef long long ll ;
ll qpow(ll k)
{
    ll ans=1,buff=2 ;
    while(k)
    {
        if(k&1)ans=(ans*buff)%9997 ;
        buff=(buff*buff)%9997 ;
        k>>=1 ;
    }
    return ans ;
}
typedef struct L{
    int s,t ;
    int nxt ;
}L ;
L e[10001] ;
int vis[1001] ;
int head[1001] ;
int cnt ;
void ins(int s,int t)
{
    e[cnt].s=s ;
    e[cnt].t=t ;
    e[cnt].nxt=head[s] ;
    head[s]=cnt++ ;
}
int n,m ;
ll k ;
int dfs(int u)
{
    vis[u]=-1 ;
    for(int i=head[u] ;i!=-1 ;i=e[i].nxt)
    {
        int v=e[i].t ;
        if(vis[v]<0)
            return 0 ;
        else if(!vis[v] && !dfs(v))
            return 0 ;
    }
    vis[u]=1 ;
    return 1 ;
}
int solve()
{
    for(int u=0 ;u<n ;u++)
        if(!vis[u] && !dfs(u))
            return 0 ;
    return 1 ;
}
int main()
{
    scanf("%d%d%lld",&n,&m,&k) ;
    memset(vis,0,sizeof(vis)) ;
    memset(head,-1,sizeof(head)) ;
    cnt=0 ;
    for(int i=0 ;i<m ;i++)
    {
        int a,b ;
        scanf("%d%d",&a,&b) ;
        ins(a,b) ;
    }
    if(solve())
    {
        puts("Yes") ;
        printf("%I64d\n",qpow(k)) ;
    }
    else
    {
        puts("No") ;
        printf("%lld\n",k*k) ;
    }
    return 0  ;
}
View Code