hdu2460 Network
来源:互联网 发布:九鼎下落知乎 编辑:程序博客网 时间:2024/06/05 07:59
思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边(u,v),如果满足
low[v]>dfn[u],则为桥,这样我们就可以知道图中桥的数目了。对于每一次query,可以考虑dfs树,树边肯定是桥,然后连
上u,v这条边之后,就会形成一个环,这样环内的边就不是割边了,所以只要找到u,v的LCA,把这个路径上的桥标记为否就可以了。
const int maxn = 1e5 + 10;vector<vector<int> > G;int dfn[maxn], low[maxn], isbridge[maxn], mark[maxn], depth;int pre[maxn];int bridge_cnt;void dfs(int u, int fa) { dfn[u] = low[u] = ++depth; mark[u] = 1; int first = 1; int size = G[u].size(); for (int i = 0;i < size;++i) { int v = G[u][i]; if (first && v == fa) { first = 0; continue; } if (dfn[v] == -1) { pre[v] = u; dfs(v, u); low[u] = min(low[u], low[v]); if (low[v] > dfn[u]) {//is bridge isbridge[v] = 1; bridge_cnt++; } }else if (mark[v]) low[u] = min(low[u], dfn[v]); }}int calc(int u,int v) { int ret = 0; if (dfn[u] < dfn[v]) swap(u, v); while(dfn[u] > dfn[v]) { if (isbridge[u]) { isbridge[u] = 0; ret++; } u = pre[u]; } while(dfn[v] > dfn[u]) { if (isbridge[v]) { isbridge[v] = 0; ret++; } v = pre[v]; } // while(u != v) { // if (isbridge[u]) {isbridge[u] = 0,ret++;} // if (isbridge[v]) {isbridge[v] = 0,ret++;} // u = pre[u]; // v = pre[v]; // } return ret;}/*int calc(int u,int v) { int ret = 0; // if (dfn[u] < dfn[v]) swap(u, v); while(dfn[u] > dfn[v]) { if (isbridge[u]) { isbridge[u] = 0; ret++; } u = pre[u]; } while(dfn[v] > dfn[u]) { if (isbridge[v]) { isbridge[v] = 0; ret++; } v = pre[v]; } while(u != v) { if (isbridge[u]) {isbridge[u] = 0,ret++;} if (isbridge[v]) {isbridge[v] = 0,ret++;} u = pre[u]; v = pre[v]; } return ret;}*/int main(int argc, const char * argv[]){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); // clock_t _ = clock(); int n, m; while(scanf("%d%d", &n, &m) != EOF && n + m) { G.clear(); G.resize(n + 2); int u, v; for (int i = 1;i <= m;++i) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } memset(dfn, -1,sizeof dfn); memset(isbridge, 0, sizeof isbridge); memset(mark, 0,sizeof mark); depth = 0, bridge_cnt = 0; dfs(1, -1); scanf("%d", &m); printf("Case %d:\n", ++nCase); while(m--) { scanf("%d%d", &u, &v); int cnt = calc(u, v); bridge_cnt -= cnt; printf("%d\n", bridge_cnt); } printf("\n"); } // printf("\nTime cost: %.2fs\n", 1.0 * (clock() - _) / CLOCKS_PER_SEC); return 0;}
0 0
- hdu2460 Network
- [HDU2460] Network [2008 Asia Hefei Regional Contest Online E]
- hdu2460 和 poj3694
- hdu2460&&poj3694 缩点+lca变形
- hdu2460 poj3694 求桥 + 求lca
- poj3694+hdu2460 求桥+缩点+LCA/tarjan
- [network]
- NETWORK
- Network
- network
- network
- Network
- NETWORK
- network
- Network
- network
- Network
- Network
- hibernate缓存机制
- sql删除一个月前的所有数据
- C/C++中static关键字详解
- Tomcat启动过程源码研究
- LeetCode题解-61-Rotate List
- hdu2460 Network
- Yii2验证码线下可以显示,线上不能显示
- java nio 常见的nio类, nio 写文件方法, nio 比io 的优势
- zynq环境搭建(一)
- iOS网络编程
- nginx,apache开启文件目录浏览功能
- 从一个字符串中提取子字符串 /字符串的逆置/查找字符第一次出现的位置
- C语言基础 查看字符的ASCII码
- Elasticsearch java API (5)Transport Client