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 ; }