luogu P2783 有机化学之神偶尔会做作弊
嘟嘟嘟
一道很水的黑题~~
边双缩点后用lca求树上两点间路径即可。
但是比较坑的是这道题是忽略重边的,结果我还特意考虑了重边,然后WA了几发。
还有两个点TLE了,原因是建新图的时候出现了重边。这个重边不是算法的问题,因为边双缩点后不可能有重边,而是写法上的问题:在建无向边的时候,习惯addEdge(x, y), addEdge(y, x),然而边双建边的时候两个点之间实际上连了4条边。所以写的时候只用建单向边,形成的图却是无向图。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cctype> 8 #include<vector> 9 #include<queue> 10 #include<stack> 11 using namespace std; 12 #define enter puts("") 13 #define space putchar(' ') 14 #define Mem(a, x) memset(a, x, sizeof(a)) 15 #define rg register 16 typedef long long ll; 17 typedef double db; 18 const db eps = 1e-8; 19 const int INF = 0x3f3f3f3f; 20 const int maxn = 1e4 + 5; 21 const int maxe = 5e4 + 5; 22 inline ll read() 23 { 24 ll ans = 0; 25 char ch = getchar(), las = ' '; 26 while(!isdigit(ch)) las = ch, ch = getchar(); 27 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 28 if(las == '-') ans = -ans; 29 return ans; 30 } 31 inline void write(ll x) 32 { 33 if(x < 0) putchar('-'), x = -x; 34 if(x >= 10) write(x / 10); 35 putchar(x % 10 + '0'); 36 } 37 38 int n, m; 39 40 struct Edge 41 { 42 int nxt, to; 43 }e[maxe << 1], e2[maxe << 1]; 44 int head[maxn], ecnt = -1; 45 void addEdge(int x, int y) 46 { 47 e[++ecnt] = (Edge){head[x], y}; 48 head[x] = ecnt; 49 } 50 51 int dfn[maxn], low[maxn], cnt = 0; 52 bool in[maxn]; 53 int st[maxn], top = 0; 54 int col[maxn], ccol = 0; 55 void tarjan(int now, int f) 56 { 57 dfn[now] = low[now] = ++cnt; 58 st[++top] = now; in[now] = 1; 59 for(int i = head[now]; i != -1; i = e[i].nxt) 60 { 61 if(!dfn[e[i].to]) 62 { 63 tarjan(e[i].to, now); 64 low[now] = min(low[now], low[e[i].to]); 65 } 66 else if(e[i].to != f) low[now] = min(low[now], dfn[e[i].to]); 67 } 68 if(dfn[now] == low[now]) 69 { 70 int x; ++ccol; 71 do 72 { 73 x = st[top--]; 74 col[x] = ccol; 75 in[x] = 0; 76 }while(x != now); 77 } 78 } 79 80 int head2[maxn], ecnt2 = -1; 81 void addEdge2(int x, int y) 82 { 83 e2[++ecnt2] = (Edge){head2[x], y}; 84 head2[x] = ecnt2; 85 } 86 void newGraph(int now) 87 { 88 int u = col[now]; 89 for(int i = head[now]; i != -1; i = e[i].nxt) 90 { 91 int v = col[e[i].to]; 92 if(u == v) continue; 93 addEdge2(u, v); //addEdge2(v, u); 94 } 95 } 96 97 const int N = 20; 98 int fa[maxn][25], dep[maxn]; 99 void dfs(int now, int f) 100 { 101 for(int i = 1; i <= N; ++i) 102 fa[now][i] = fa[fa[now][i - 1]][i - 1]; 103 for(int i = head2[now]; i != -1; i = e2[i].nxt) 104 { 105 if(e2[i].to == f) continue; 106 fa[e2[i].to][0] = now; 107 dep[e2[i].to] = dep[now] + 1; 108 dfs(e2[i].to, now); 109 } 110 } 111 int lca(int x, int y) 112 { 113 if(dep[x] < dep[y]) swap(x, y); 114 for(int i = N; i >= 0; --i) 115 if(dep[x] - (1 << i) >= dep[y]) x = fa[x][i]; 116 if(x == y) return x; 117 for(int i = N; i >= 0; --i) 118 if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; 119 return fa[x][0]; 120 } 121 122 void print(int x) 123 { 124 if(!x) return; 125 print(x >> 1); 126 write(x & 1); 127 } 128 void solve(int x, int y) 129 { 130 int z = lca(x, y); 131 print(dep[x] - dep[z] + dep[y] - dep[z] + 1); 132 enter; 133 } 134 135 int main() 136 { 137 Mem(head, -1); 138 n = read(); m = read(); 139 for(int i = 1; i <= m; ++i) 140 { 141 int x = read(), y = read(); 142 addEdge(x, y); addEdge(y, x); 143 } 144 for(int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i, 0); 145 Mem(head2, -1); 146 for(int i = 1; i <= n; ++i) newGraph(i); 147 dfs(col[1], 0); 148 int q = read(); 149 for(int i = 1; i <= q; ++i) 150 { 151 int x = read(), y = read(); 152 solve(col[x], col[y]); 153 } 154 return 0; 155 }
View Code
转载于:https://www.cnblogs.com/mrclr/p/9861508.html
luogu P2783 有机化学之神偶尔会做作弊相关推荐
- 【题解】Luogu P2783 有机化学之神偶尔会做作弊
原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ...
- 饭店菜单选择c语言,求C语言大神,帮忙做一下这个题,要源代码设计实现一个餐厅点餐系统? 爱问知识人...
求C语言大神,帮忙做一下这个题,要源代码 设计实现一个餐厅点餐系统,实现电子点餐.要求实现二级菜单: 一级菜单: 请选择: 1.点餐 2.查看已点菜品 3.添菜 求C语言大神,帮忙做一下这个题,要源代 ...
- 零基础能否转行做程序员,那些半路出家的程序员大神给你做了榜样
这些年,随着中国互联网产业的高速发展,对程序员这个职业的需求越来越大.而相对较高的薪水.简单的人际关系.入行不需要靠拼爹这些优点,也让越来越多的年轻人选择了这个职业.甚至很多本来已经从事了其他行业的年 ...
- luogu P1774 最接近神的人_NOI导刊2010提高(02)
题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...
- cad2016中选择全图字体怎么操作_想知道大神是怎么做PPT的吗?一个插件,帮你省出俩小时!...
大家都知道一份优秀的PPT设计,画质清晰,紧扣主题的高质量图片是不可或缺的. 那你们平时做PPT时,都在哪找图的呢? 千图,花瓣,站酷?同时要打开好几个网站搜索,找起来还是相当的麻烦啊,但你有了这款小 ...
- luogu P4240 毒瘤之神的考验(莫比乌斯反演+递推前缀和+数论分块)
problem 洛谷链接 solution ∑i=1n∑j=1mφ(ij)=∑i=1n∑j=1mφ(i)φ(j)gcd(i,j)φ(gcd(i,j))\sum_{i=1}^n\sum_{j=1}^ ...
- java 歌词_请问吧内有大神用JAVA做过桌面歌词吗
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写了个简单的例子给你: public class TextChangePane extends JComponent implements ActionL ...
- 一点排位就安全异常退出_吃鸡战场排位连跪最好的处理方式并不是继续排位,大神一般这样做!...
☝防迷路-点击上方蓝色字-右上角找到[-] 立刻设我为☀星标/置顶☀ 排位连跪是很多玩家都遇到的事情,有时候自己连跪几把都不清楚,反正看着战绩那一排红色格外的显眼,看着自己那辛辛苦苦打上去的星星一直 ...
- blackjack java gui_求助一个java的题,blackjack, class 分为Card 和Deck,求大神帮我做一个程序...
展开全部 class Card { private int face; private String color; public Card(int face, String color){ this. ...
- 国外大神教你做自动调整平衡的爬楼梯机器人
自平衡机器人是独特的移动平台,使用闭环控制系统可将其直立在两个轮子上.他们可以使用差速转向在现场打开,并具有紧凑的外形尺寸,从而限制了所需的地面空间.但是,它们有很大的局限性,无法在实际应用中使用:它 ...
最新文章
- 用于半监督语义分割的基于掩码的数据增强
- Spring 如何初始化泛型类实例
- ReactiveCocoa源码拆分解析(七)
- SpringBoot(二):Web之Filter
- linux卸载数据库后还在吗,oracle停止数据库后linux完全卸载oracle的详细步骤
- Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
- python-函数定义
- JAVA可不可以编写应用程序_编写一个java应用程序
- POCO库中文编程参考指南(11)如何使用Reactor框架?
- 最新电视直播PHP源码V1.2
- 弹性力学第五版pdf_弹性力学txt-弹性力学pdf-谁知我电子书
- 网站死链检测的软件-网站死链检测的工具
- 科赫雪花小包裹实例详解
- 【机器学习基础】无监督学习(1)——PCA
- 今日头条前端面试总结
- idea的git报错You have not concluded your merge
- C++动态规划算法之怪盗基德的滑翔翼
- 校招群面及专业面技巧总结(适用产品等非技术岗)
- 在线网校系统搭建的意义是什么?怎么搭建?
热门文章
- [RHEL5企业级Linux服务攻略]--第8季 Iptables服务全攻略之实战配置
- 「leetcode」17.电话号码的字母组合【回溯算法】详解!
- 「leetcode」101. 对称二叉树
- Lightroom Classic 教程,如何结合使用Photoshop 和 Lightroom?
- 在 MacBook 中如何将外置屏幕设置为主屏幕?
- 如何在 Mac 上的“照片”中更改和增强视频?
- 如何修复“ DNS_PROBE_FINISHED_NXDOMAIN”错误
- 如何在Mac设置开机自启程序项
- Python3实现旋转数组的3种算法 1
- 使用纯CSS实现圣诞节雪花图案