首页 > 其他 > 详细

HRBUST2048 Thrall’s Dream 题解报告

时间:2019-08-28 12:07:24      阅读:96      评论:0      收藏:0      [点我收藏+]

题目传送门

【题目大意】

令人绝望的超长英文体面……然而实际上题意很简单

给出$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 }
代码戳这里

HRBUST2048 Thrall’s Dream 题解报告

原文:https://www.cnblogs.com/THWZF/p/11422895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!