HRBUST2048 Thrall’s Dream 题解报告
【题目大意】
令人绝望的超长英文体面……然而实际上题意很简单
给出$n$个点和$m$条有向边,判断这个图是否连通,连通的定义是对于任意两个点$x,y$,满足有路径从$x$到$y$或有路径从$y$到$x$。
【思路分析】
这题还是很简单的啦,连好边之后从每个点出发$dfs$一遍,如果连通就记录,最后判断一下就行了,复杂度$O(N)$。
【代码实现】
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #define g() getchar() 7 #define rg register 8 #define go(i,a,b) for(rg int i=a;i<=b;i++) 9 #define back(i,a,b) for(rg int i=a;i>=b;i--) 10 #define db double 11 #define ll long long 12 #define il inline 13 #define pf printf 14 #define mem(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 int fr(){ 17 int w=0,q=1; 18 char ch=g(); 19 while(ch<'0'||ch>'9'){ 20 if(ch=='-') q=-1; 21 ch=g(); 22 } 23 while(ch>='0'&&ch<='9') w=(w<<1)+(w<<3)+ch-'0',ch=g(); 24 return w*q; 25 } 26 const int N=2002,M=10002; 27 int T,n,m,head[N]; 28 bool d[N][N]; 29 struct edge{ 30 int to,next; 31 }e[M]; 32 il void work(rg int from,rg int now){ 33 d[from][now]=1; 34 for(rg int i=head[now];i;i=e[i].next) 35 if(!d[from][e[i].to]) work(from,e[i].to); 36 return; 37 } 38 int main(){ 39 //freopen("","r",stdin); 40 //freopen("","w",stdout); 41 T=fr(); 42 go(t,1,T){ 43 bool ans=1; 44 n=fr();m=fr(); 45 mem(head,0);mem(d,0); 46 go(i,1,m){ 47 rg int u=fr(),v=fr(); 48 e[i].next=head[u]; 49 e[i].to=v; 50 head[u]=i; 51 } 52 go(i,1,n) work(i,i); 53 go(i,1,n) go(j,1,n) if(!d[i][j]&&!d[j][i]) {ans=0;break;} 54 if(ans) pf("Case %d: Kalimdor is just ahead\n",t); 55 else pf("Case %d: The Burning Shadow consume us all\n",t); 56 } 57 return 0; 58 }