两道和Tarjan有关的图论题

来源:互联网 发布:软件后续技术支持方案 编辑:程序博客网 时间:2024/06/03 11:09
重要道路 
Time Limits: 1000 ms  Memory Limits: 262144 KB     


Description


给定一个无向图 G,对于其中的一条边(u,v),将它删除之后会使得从 1 到 n 的最短路长度增加,那么这条边被称为“重要道路”。
求 G 中所有的重要道路。


Input


第一行两个整数 n,m,分别代表点数和边数。
接下来 m 行,每行三个整数 u,v,c,代表权值为 c 的无向边(u,v)。可能有重 边,但没有自环。保证 1 号点和 n 号点是连通的。


Output


第一行一个整数 k,代表重要道路的数量。
下一行升序输出 k 个数代表重要道路的编号(按输入顺序从 1 到 m)。


Sample Input


6 7
1 2 1
2 3 1
2 5 3
1 3 2
3 5 1
2 4 1
5 6 2


Sample Output


2
5 7


Data Constraint


20%的数据,n,m<=10。
另外 20%的数据,m=n-1。

100%的数据,1<=n<=20000,1<=m,c<=100000。


思路::先是最短路求出dis[]

然后什么样的路会可能是重要道路呢?

可以这么说,对于点i,有点j可以走到点i

若有d[i] == d[j] + EdgeValue[i][j]

那么边(i,j)可能是重要道路

我们把可能是重要道路的路扔进一个新图,然后在新图上找割边,问题就解决了。


出行 (Standard IO)
Time Limits: 1000 ms  Memory Limits: 262144 KB     


Description


 
【问题の描述】
 
上海又叫做申城,那里的地铁一直是很拥挤的。鸡腿从张江去邯郸本部的路上常常是挤得……瘦了一圈。但是呢今天因为没有学霸的碾压,鸡腿心情很好决定要出去玩。为了避免遇上残酷的拥挤的地铁线,鸡腿想要查找一些路线中的必经地点,请你来告诉他吧。
上海的地铁被描述为N个点M条边的一个无向图,每次鸡腿会告诉你他在第S条路上,想要到第T条路上(别问我为什么是路上……),你能告诉他有多少个途中的点是他必须要经过的吗?


Input


第一行输入两个正整数N,M表示无向图的点数和边数。
 
第2到M+1行每行两个整数X、Y,表示X节点和Y节点之间有一条无向边。(数据保证无重边自环)
接下来一行输入一个整数Q,表示有Q个询问
接下来Q行每行两个正整数S、T,表示询问第S条边到第T条边有多少点一定会经过。


Output


对于每个询问输出一行一个整数表示至少有Ans个点一定会经过。


Sample Input


5 6
1 2
1 3
2 3
3 4
4 5
3 5
2
2 3
2 4


Sample Output


0
1


Data Constraint


对于20%的数据1 ≤ N ≤ 10^2,1 ≤ M ≤ 10^3,1 ≤ Q ≤ 10^3;
对于40%的数据 1 ≤ N ≤ 10^3,1 ≤ M ≤ 10^4,1 ≤ Q ≤ 10^3;
对于100%的数据 1 ≤ N ≤ 10^4,1 ≤ M ≤ 10^5,1 ≤ Q ≤ 10^4,0<Xi,Yi ≤ N, 0< S,T ≤ M。

这题他是从边出发到边的。应联想到化边为点。
是人都会想到要用tarjan,我们应找割点,然后呢?
对,化边集为点,将双联通的边集化为一个点,然后割点单独一个点
新图必定是一个边点隔一个割点的一颗数。
那么问题转化成求树上两点距离,这个可以logN实现,用倍增求LCA。




0 0
原创粉丝点击