大意:给定一些点间的关系,问任意两点都是联通的(有向图)
思路:1、bfs搜索搜n次,每次从一个节点开始,然后遍历于此节点关联的,然后再遍历其孙子、重孙节点等于当前节点做标记。之后暴力找没有联通的就是任意两点不能联通。
2、图论书上的单连通模板。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
#define MAX 1000
#define inf 0x3f3f3f3f
using namespace std;
struct node{
int to,next;
}q[1000000];
int head[10100],cnt;
bool vis[2100],mp[2100][2100];
void add(int a,int b){
q[cnt].to = b;
q[cnt].next= head[a];
head[a] = cnt++;
}
void bfs(int x){
memset(vis,false,sizeof(vis));
queue<int>qu;
qu.push(x);
vis[x] = true;
while(!qu.empty()){
int u = qu.front();
qu.pop();
for(int i = head[u];~i;i = q[i].next){
int v = q[i].to;
if(vis[v]) continue;
mp[x][v] = true;
qu.push(v);
vis[v] = true;
}
}
}
int main(){
int n,m,i,j,k,cla,a,b;
while(~scanf("%d",&cla)){
for(int zu = 1;zu <= cla;++ zu){
scanf("%d%d",&n,&m);
cnt = 0;
memset(head,-1,sizeof(head));
memset(mp,false,sizeof(mp));
for(i = 0;i < m;++ i){
scanf("%d%d",&a,&b);
add(a,b);
}
for(i = 1;i <= n;++ i)
bfs(i);
bool bj = false;
for(i = 1;i <= n;++ i){
for(j = i + 1;j <= n;++ j){
if(!mp[i][j]&&!mp[j][i]){
bj = true;break;
}
}
if(bj) break;
}
printf("Case %d:",zu);
if(bj)
puts(" The Burning Shadow consume us all");
else
puts(" Kalimdor is just ahead");
}
}
return 0;
}