嘟嘟嘟

一道很水的黑题~~

边双缩点后用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 有机化学之神偶尔会做作弊相关推荐

  1. 【题解】Luogu P2783 有机化学之神偶尔会做作弊

    原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ...

  2. 饭店菜单选择c语言,求C语言大神,帮忙做一下这个题,要源代码设计实现一个餐厅点餐系统? 爱问知识人...

    求C语言大神,帮忙做一下这个题,要源代码 设计实现一个餐厅点餐系统,实现电子点餐.要求实现二级菜单: 一级菜单: 请选择: 1.点餐 2.查看已点菜品 3.添菜 求C语言大神,帮忙做一下这个题,要源代 ...

  3. 零基础能否转行做程序员,那些半路出家的程序员大神给你做了榜样

    这些年,随着中国互联网产业的高速发展,对程序员这个职业的需求越来越大.而相对较高的薪水.简单的人际关系.入行不需要靠拼爹这些优点,也让越来越多的年轻人选择了这个职业.甚至很多本来已经从事了其他行业的年 ...

  4. luogu P1774 最接近神的人_NOI导刊2010提高(02)

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...

  5. cad2016中选择全图字体怎么操作_想知道大神是怎么做PPT的吗?一个插件,帮你省出俩小时!...

    大家都知道一份优秀的PPT设计,画质清晰,紧扣主题的高质量图片是不可或缺的. 那你们平时做PPT时,都在哪找图的呢? 千图,花瓣,站酷?同时要打开好几个网站搜索,找起来还是相当的麻烦啊,但你有了这款小 ...

  6. 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}^ ...

  7. java 歌词_请问吧内有大神用JAVA做过桌面歌词吗

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写了个简单的例子给你: public class TextChangePane extends JComponent implements ActionL ...

  8. 一点排位就安全异常退出_吃鸡战场排位连跪最好的处理方式并不是继续排位,大神一般这样做!...

    ☝防迷路-点击上方蓝色字-右上角找到[-] 立刻设我为☀星标/置顶☀  排位连跪是很多玩家都遇到的事情,有时候自己连跪几把都不清楚,反正看着战绩那一排红色格外的显眼,看着自己那辛辛苦苦打上去的星星一直 ...

  9. blackjack java gui_求助一个java的题,blackjack, class 分为Card 和Deck,求大神帮我做一个程序...

    展开全部 class Card { private int face; private String color; public Card(int face, String color){ this. ...

  10. 国外大神教你做自动调整平衡的爬楼梯机器人

    自平衡机器人是独特的移动平台,使用闭环控制系统可将其直立在两个轮子上.他们可以使用差速转向在现场打开,并具有紧凑的外形尺寸,从而限制了所需的地面空间.但是,它们有很大的局限性,无法在实际应用中使用:它 ...

最新文章

  1. 用于半监督语义分割的基于掩码的数据增强
  2. Spring 如何初始化泛型类实例
  3. ReactiveCocoa源码拆分解析(七)
  4. SpringBoot(二):Web之Filter
  5. linux卸载数据库后还在吗,oracle停止数据库后linux完全卸载oracle的详细步骤
  6. Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
  7. C# new关键字和对象类型转换(双括号、is操作符、as操作符)
  8. python-函数定义
  9. JAVA可不可以编写应用程序_编写一个java应用程序
  10. POCO库中文编程参考指南(11)如何使用Reactor框架?
  11. 最新电视直播PHP源码V1.2
  12. 弹性力学第五版pdf_弹性力学txt-弹性力学pdf-谁知我电子书
  13. 网站死链检测的软件-网站死链检测的工具
  14. 科赫雪花小包裹实例详解
  15. 【机器学习基础】无监督学习(1)——PCA
  16. 今日头条前端面试总结
  17. idea的git报错You have not concluded your merge
  18. C++动态规划算法之怪盗基德的滑翔翼
  19. 校招群面及专业面技巧总结(适用产品等非技术岗)
  20. 在线网校系统搭建的意义是什么?怎么搭建?

热门文章

  1. [RHEL5企业级Linux服务攻略]--第8季 Iptables服务全攻略之实战配置
  2. 「leetcode」17.电话号码的字母组合【回溯算法】详解!
  3. 「leetcode」101. 对称二叉树
  4. Lightroom Classic 教程,如何结合使用Photoshop 和 Lightroom?
  5. 在 MacBook 中如何将外置屏幕设置为主屏幕?
  6. 如何在 Mac 上的“照片”中更改和增强视频?
  7. 如何修复“ DNS_PROBE_FINISHED_NXDOMAIN”错误
  8. 如何在Mac设置开机自启程序项
  9. Python3实现旋转数组的3种算法 1
  10. 使用纯CSS实现圣诞节雪花图案