[HDOJ6165] FFF at Valentine(强联通分量,缩点,拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165
题意:问一个有向图中是否有任意两点可以到达。
读错题就彻底输了,读成判断是否有任意条路,使得经过所有点并且每条边最多走一次。
强联通缩点,然后维护拓扑序,假如拓扑序中有两个以上点入度为0,那么这几个点之间就不能互相到达了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 namespace fastIO { 5 #define BUF_SIZE 20 6 bool IOerror = 0; 7 inline char nc() { 8 static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE; 9 if (p1 == pend) { 10 p1 = buf; 11 pend = buf + fread(buf, 1, BUF_SIZE, stdin); 12 if (pend == p1) { 13 IOerror = 1; 14 return -1; 15 } 16 } 17 return *p1++; 18 } 19 inline bool blank(char ch) { 20 return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'; 21 } 22 inline void read(int &x) { 23 char ch; 24 while (blank(ch = nc())); 25 if (IOerror) 26 return; 27 for (x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0'); 28 } 29 #undef BUF_SIZE 30 }; 31 32 const int maxn = 1010; 33 const int maxm = 6060; 34 typedef struct Edge { 35 int u, v, next; 36 Edge() { next = -1; } 37 }Edge; 38 int n, m, cnt; 39 int head[maxn], ecnt; 40 Edge edge[maxm]; 41 int bcnt, dindex; 42 int dfn[maxn], low[maxn]; 43 int stk[maxn], top; 44 int belong[maxn]; 45 int in[maxn]; 46 bool instk[maxn]; 47 bool vis[maxn]; 48 int f[maxn][maxn]; 49 50 void init() { 51 memset(edge, 0, sizeof(edge)); 52 memset(head, -1, sizeof(head)); 53 memset(instk, 0, sizeof(instk)); 54 memset(dfn, 0, sizeof(dfn)); 55 memset(low, 0, sizeof(low)); 56 memset(belong, 0, sizeof(belong)); 57 memset(in, 0, sizeof(in)); 58 ecnt = top = bcnt = dindex = 0; 59 } 60 61 void adde(int uu, int vv) { 62 edge[ecnt].u = uu; 63 edge[ecnt].v = vv; 64 edge[ecnt].next = head[uu]; 65 head[uu] = ecnt++; 66 } 67 68 void tarjan(int u) { 69 int v = u; 70 dfn[u] = low[u] = ++dindex; 71 stk[++top] = u; 72 instk[u] = 1; 73 for(int i = head[u]; ~i; i=edge[i].next) { 74 v = edge[i].v; 75 if(!dfn[v]) { 76 tarjan(v); 77 low[u] = min(low[u], low[v]); 78 } 79 else if(instk[v]) low[u] = min(low[u], dfn[v]); 80 } 81 if(dfn[u] == low[u]) { 82 bcnt++; 83 do { 84 v = stk[top--]; 85 instk[v] = 0; 86 belong[v] = bcnt; 87 } while(v != u); 88 } 89 } 90 91 queue<int> q; 92 93 int check() { 94 while(!q.empty()) { 95 int u = q.front(); q.pop(); 96 int tot = 0; 97 for(int v = 1; v <= bcnt; v++) { 98 if(!f[u][v]) continue; 99 in[v]--; 100 if(!in[v]) { 101 tot++; 102 q.push(v); 103 } 104 } 105 if(tot >= 2) return puts("Light my fire!"); 106 } 107 return puts("I love you my love and our love save us!"); 108 } 109 110 signed main() { 111 // freopen("in", "r", stdin); 112 using namespace fastIO; 113 int T, u, v; 114 read(T); 115 while(T--) { 116 read(n); read(m); 117 init(); 118 memset(f, 0, sizeof(f)); 119 for(int i = 0; i < m; i++) { 120 read(u); read(v); 121 adde(u, v); 122 } 123 for(int i = 1; i <= n; i++) { 124 if(!dfn[i]) tarjan(i); 125 } 126 for(int i = 0; i < ecnt; i++) { 127 u = belong[edge[i].u], v = belong[edge[i].v]; 128 if(u == v) continue; 129 if(f[u][v]) continue; 130 f[u][v] = 1; in[v]++; 131 } 132 while(!q.empty()) q.pop(); 133 int cnt = 0; 134 for(int i = 1; i <= bcnt; i++) { 135 if(in[i] == 0) { 136 q.push(i); 137 cnt++; 138 } 139 } 140 (cnt == 1) ? check() : puts("Light my fire!"); 141 } 142 return 0; 143 }
转载于:https://www.cnblogs.com/kirai/p/7413185.html
[HDOJ6165] FFF at Valentine(强联通分量,缩点,拓扑排序)相关推荐
- [图论]强联通分量+缩点 Summer Holiday
Summer Holiday Description 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系 ...
- bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset
Description 对于100%的数据,N不超过2000. Solution 容易想到要tarjan缩点按拓扑序递推,但是去重的步骤不好弄 C++STL中有bitset,用这个当成二进制按位状压即 ...
- P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P3387 大意 一个有向图.每个点有权值,但每个值只能取一次,每条边 ...
- CodeForces 1213F (强联通分量分解+拓扑排序)
传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...
- Tarjan的强联通分量
求强联通分量有很多种. <C++信息学奥赛一本通> 中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...
- POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)
[题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...
- POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)
[题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...
- 强联通分量与双连通分量
强联通分量 1.概念 在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次 ...
- 关于强联通分量 的求法讨论
这个讨论主要是关于 HA2006年最受欢迎的牛 的讨论 . 尽管这道题对于很多dalao来说都觉得是模板题,但是仍是值得思考的,因为我第一次写这道题的时候, 缩完点之后建图建错玄学跑dfs n^2做法 ...
- POJ 2186 Popular Cows (强联通分量)
链接 :http://poj.org/problem?id=2186 一个联通分量里的所有的牛满足任何一个被其他牛认为是红人.强联通缩点之后 只需要找到一个且只有一个联通分量且它的出度为0 答案就是这 ...
最新文章
- mysql查询以文件形式导出_mysql以文件形式导入导出整个数据库
- ejb运行程序_在哪里可以运行EJB?
- hbuilder自述文件_一次修复一个自述文件
- 造谣“外卖员因差评杀人” 女子被依法刑事拘留
- fread python有没有_将C的fread转换为python,没有得到预期的输出
- EBMIDE——打印格式管理
- 唐山大地震 昨夜万人首映 尚雯婕演唱《23秒,32年》使观众情绪得以第二次温暖爆发...
- linux内核syscall_define6,linux中添加系统调用
- AndroidUI的基本结构
- 如何用优盘安装服务器操作系统,使用优盘安装服务器
- AI识别照片是谁,人脸识别face_recognition开源项目安装使用 | 机器学习
- 计算机u盘病毒清除方式,U盘如何格式化和清理病毒
- Linux-hostname查看及修改
- python 3.7.732位安装步骤_Python 3.7.7详细图文安装教程(附安装包) | 我爱分享网
- 注册页面reg.html
- 一些边边角角的东西。
- 【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现
- golang tollbooth 中间件 压测工具 vegeta
- 不搞笑不给力——年会小品 山寨新闻联播
- 产品经理(16)#PC端设计
热门文章
- dell笔记本耳机怎么设置_win10笔记本怎么设置合上盖子不休眠
- 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
- react mysql增删改查_react增删改查
- 如何网络推广分析新站上线后网站不收录的原因有哪些?
- mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
- 服务器跑python程序_远程编写+调试服务器上的Python程序
- mysql 优化版_MySQL优化(超完整版)(一)
- Java函数式折叠,循环,记忆化效率初识
- Cassandra 的数据存储结构——本质是SortedMapRowKey, SortedMapColumnKey, ColumnValue
- MultiSet和Set的区别