题意:
给你n个点m个单向边,问是否任意2点是否联通
分析:
对每个点跑bfs最后判读has【i】【j】||has【j】【i】的值
ACcode:
#include <bits/stdc++.h>
#define maxn 2001
using namespace std;
struct N{int to,next;}my[maxn];
int head[maxn],tot;
void init(){memset(head,-1,sizeof(head));tot=0;}
void add(int u,int v){my[tot].to=v;my[tot].next=head[u];head[u]=tot++;}
int n,m,q;
bool has[maxn][maxn],vis[maxn];
struct Q{
int u,v;
void in(){
scanf("%d%d",&u,&v);
add(u,v);
}
}dp;
void bfs(int x){
memset(vis,false,sizeof(vis));
queue<int>q;
vis[x]=true;
q.push(x);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i!=-1;i=my[i].next){
int v=my[i].to;
if(!vis[v]){
vis[v]=true;
has[v][x]=has[x][v]=true;
q.push(v);
}
}
}
}
int main(){
int loop,cnt=1;
scanf("%d",&loop);
while(loop--){
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)dp.in();
memset(has,0,sizeof(has));
for(int i=1;i<=n;++i)bfs(i);
bool flag=true;
for(int i=1;flag&&i<=n;++i)
for(int j=i+1;flag&&j<=n;++j)
if(!has[i][j]&&!has[j][i])flag=false;
printf("Case %d: %s\n",cnt++,flag?"Kalimdor is just ahead":"The Burning Shadow consume us all");
}
return 0;
}