2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1060 Accepted Submission(s): 506
Problem Description
At Valentine's eve, Shylock and Lucar were enjoying their time as any other couples. Suddenly, LSH, Boss of FFF Group caught both of them, and locked them into two separate cells of the jail randomly. But as the saying goes: There is always a way out , the lovers made a bet with LSH: if either of them can reach the cell of the other one, then LSH has to let them go. The jail is formed of several cells and each cell has some special portals connect to a specific cell. One can be transported to the connected cell by the portal, but be transported back is impossible. There will not be a portal connecting a cell and itself, and since the cost of a portal is pretty expensive, LSH would not tolerate the fact that two portals connect exactly the same two cells. As an enthusiastic person of the FFF group, YOU are quit curious about whether the lovers can survive or not. So you get a map of the jail and decide to figure it out.
Input
∙Input starts with an integer T (T≤120), denoting the number of test cases. ∙For each case, First line is two number n and m, the total number of cells and portals in the jail.(2≤n≤1000,m≤6000) Then next m lines each contains two integer u and v, which indicates a portal from u to v.
Output
If the couple can survive, print “I love you my love and our love save us!” Otherwise, print “Light my fire!”
Sample Input
3
5 5
1 2
2 3
2 4
3 5
4 5
3 3
1 2
2 3
3 1
5 5
1 2
2 3
3 1
3 4
4 5
Sample Output
Light my fire!
I love you my love and our love save us!
I love you my love and our love save us!
Source
2017 Multi-University Training Contest - Team 9
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165
分析:缩点为DAG,则如果在拓扑序中出现了有两个及以上入度为0的点则不合法
下面给出AC代码:
1 #include <iostream>
2 #include <bits/stdc++.h>
3 using namespace std;
4 const int MAXN=1010;
5 const int MAXM=6010;
6 struct Edge{
7 int to,next;
8 }edge[MAXM],edge2[MAXM];
9 int head[MAXN],head2[MAXN],tot,tot2;
10 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];
11 int Index,top;
12 int scc;
13 bool Instack[MAXN];
14 int num[MAXN];
15 int in[MAXN],out[MAXN];
16 void addedge(int u,int v){
17 edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;
18 }
19 void addedge2(int u,int v){
20 edge2[tot2].to=v;edge2[tot2].next=head2[u];head2[u]=tot2++;
21 }
22 void Tarjan(int u){
23 int v;
24 Low[u]=DFN[u]=++Index;
25 Stack[top++]=u;
26 Instack[u]=true;
27 for(int i=head[u];i!=-1;i=edge[i].next){
28 v=edge[i].to;
29 if(!DFN[v]){
30 Tarjan(v);
31 if(Low[u]>Low[v])Low[u]=Low[v];
32 }
33 else if(Instack[v]&&Low[u]>DFN[v])
34 Low[u]=DFN[v];
35 }
36 if(Low[u]==DFN[u]){
37 scc++;
38 do{
39 v=Stack[--top];
40 Instack[v]=false;
41 Belong[v]=scc;
42 num[scc]++;
43 }
44 while(v!=u);
45 }
46 }
47 void solve(int N){
48 memset(DFN,0,sizeof(DFN));
49 memset(Instack,false,sizeof(Instack));
50 memset(num,0,sizeof(num));
51 Index=scc=top=0;
52 for(int i=1;i<=N;i++){
53 if(!DFN[i])
54 Tarjan(i);
55 }
56 }
57
58 bool map2[MAXN][MAXN];
59 void build(int n){
60 memset(map2,false,sizeof(map2));
61 memset(in,0,sizeof(in));
62 memset(out,0,sizeof(out));
63 memset(head2,-1,sizeof(head2));tot2=0;
64 for(int i=1;i<=n;i++){
65 for(int j=head[i];j!=-1;j=edge[j].next){
66 int v=edge[j].to;
67 int a=Belong[i];
68 int b=Belong[v];
69 if(a==b)continue;
70 if(!map2[a][b]){
71 addedge2(a,b);
72 map2[a][b]=true;
73 in[b]++;out[a]++;
74 }
75 }
76 }
77 }
78
79 void init(){
80 tot=0;
81 memset(head,-1,sizeof(head));
82 }
83
84 bool Top(){
85 queue<int >q;
86 while(!q.empty())q.pop();
87 for(int i=1;i<=scc;i++){
88 if(in[i]==0)q.push(i);
89 }
90
91 while(!q.empty()){
92 if(q.size()!=1)return false;
93 int u=q.front();
94 q.pop();
95 for(int i=1;i<=scc;i++){
96 if(map2[u][i]==true) {
97 in[i]--;
98 if(in[i]==0)q.push(i);
99 }
100 }
101 }
102 return true;
103 }
104
105 int n,m;
106 int main()
107 {
108 int T;
109 scanf("%d",&T);
110 while(T--){
111 scanf("%d%d",&n,&m);
112 init();
113 for(int i=0;i<m;i++){
114 int u,v;
115 scanf("%d%d",&u,&v);
116 addedge(u,v);
117 }
118 solve(n);
119 build(n);
120
121 if(!Top()){printf("Light my fire!n");}
122 else printf("I love you my love and our love save us!n");
123 }
124
125 return 0;
126 }
- 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
- 点双连通分量与割点
- 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
- 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
- 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
- 2463: [中山市选2009]谁能赢呢?
- 2748: [HAOI2012]音量调节
- 2697: 特技飞行
- 我这么玩Web Api(二)
- 1296: [SCOI2009]粉刷匠
- 1293: [SCOI2009]生日礼物
- 记一次线程池调优经历
- JavaScript对象
- 1088: [SCOI2005]扫雷Mine
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 怎么快速修复 bug ?
- 变量类型(cpu/gpu)
- 【Go语言学习】匿名函数与闭包
- Python中两种UnboundLocalError的解决方法
- 传智播客OA项目学习--阶段二(实体设计及技巧)
- 小生归一(五)md5扩展长度攻击
- 传智播客OA项目学习--阶段二(系统管理模块)
- main函数中的argc和argv到底是个啥?
- 传智播客OA项目学习--阶段一(2、框架整合)
- 微信XML消息model定义之微信公众平台(一)
- 自动返回笑话接口调用之微信公众平台(二)
- 「实战」 缘分使我们(骗子)相遇
- json-lib简单使用之微信公众平台(三)
- 小生归一(六)xss特殊绕过
- 最新绕过D盾注入方法分享(学姿势)