uvalive5796(图论、桥、并查集)
2015-08-18 09:27
393 查看
题意:
给出一个无向图,每次询问,问两个点之间是否有一条唯一的不经过重复点的路径。
思路:
如果存在这样的路径,那么路径上的点就都是桥,我们可以找出图中所有的桥,把非桥边删去,把桥连的点塞到并查集中,查询的时候每次只要看两个点是否在同一个并查集即可。
这题比赛的时候没过,赛后也没写,贴一个我们校一队的代码吧。
代码:
给出一个无向图,每次询问,问两个点之间是否有一条唯一的不经过重复点的路径。
思路:
如果存在这样的路径,那么路径上的点就都是桥,我们可以找出图中所有的桥,把非桥边删去,把桥连的点塞到并查集中,查询的时候每次只要看两个点是否在同一个并查集即可。
这题比赛的时候没过,赛后也没写,贴一个我们校一队的代码吧。
代码:
#include<iostream> #include<map> #include<vector> #include<string.h> #include<stdio.h> using namespace std; const int maxa = 10005; vector<int> e[maxa]; map<int, bool> mp[maxa]; bool cut[maxa]; int low[maxa], dfn[maxa], vis[maxa]; void cut__(int cur, int father, int dep, int n){ vis[cur] = 1;dfn[cur] = low[cur] = dep; int children = 0; for(int k = 0;k < e[cur].size(); k++){ int i = e[cur][k]; if(i != father && 1 == vis[i]){ if(dfn[i] < low[cur]){ low[cur] = dfn[i]; } } if(0 == vis[i]){ cut__(i , cur, dep+1, n); children ++; if(low[i] < low[cur]) low[cur] = low[i]; if((father == -1 && children > 1) || father != -1 && low[i] >= dfn[cur]) cut[cur] = true; if(low[i] > dfn[cur]){ mp[cur][i] = mp[i][cur] = 1; // printf("*------%d %d\n", cur, i); } } } vis[cur] = 2; } int fa[maxa]; int find(int ii){ return fa[ii] = fa[ii] == ii? ii:find(fa[ii]); } int main(){ int r, c, q; while(scanf("%d%d%d", &r, &c, &q), r||c||q){ for(int i = 0;i <= r; i++){ e[i].clear(); mp[i].clear(); } for(int i = 1;i <= r; i++){ fa[i] = i; } memset(cut, 0, sizeof(cut)); memset(vis, 0, sizeof(vis)); memset(low, 0, sizeof(low)); memset(dfn, 0, sizeof(dfn)); for(int i = 0;i < c; i++){ int u, v; scanf("%d%d", &u, &v); e[u].push_back(v); e[v].push_back(u); } for(int i = 1; i <= r; i++){ if(vis[i] == 0){ cut__(i, -1, 0, r); } } for(int i = 1; i <= r; i++){ for(int k = 0; k< e[i].size(); k++){ if(mp[i][e[i][k]] == 1){ fa[find(i)] = find(e[i][k]); //printf("%d %d ------\n", i, e[i][k]); } } } while(q--){ int u, v; scanf("%d%d", &u, &v); if(find(u) == find(v)){ puts("Y"); }else{puts("N"); } }puts("-"); } }
相关文章推荐
- Eclipse快捷键
- BaseAdapter多种View适配,getItemViewType的作用
- 图 有关题目
- 01背包及其优化
- 多线程实现多任务
- 【Python学习笔记】-生成激活码
- Linux SSH 免密码登录常见问题
- 图解linux下top命令的使用
- [书目20150818]给你个门店,你该怎么管?
- 5、继电器+LED(简单的io口)
- iOS中纯手工图片浏览器
- python换行
- MVC下获得服务器的IP地址
- win2012部署asp网站相关
- 算法竞赛入门经典:第七章 暴力求解法 7.13困难的串
- arm底板中linux程序的运行
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
- android下使用aapt命令测试启动时间
- Hibernate基础
- 鼠标控制旋转