【图论04】有向图 1002 迷宫城堡
来源:互联网 发布:淘宝店铺添加音乐代码 编辑:程序博客网 时间:2024/05/01 01:07
算法思路:很明显的求有向图的强连通分量的题。
可以用tarjan算法,这也是比较常规的做法。但是在网上看到有人用并查集做的,相当神奇! 神奇的并查集!
方法转载自:http://everhythm.blog.163.com/blog/static/1794590792011113101019305/
思路 : 取定一个点n 第一个并查集表示 所有的点按一个方向都能到n 第二个并查集表示 把方向全反向 所有的点仍能到n 则强连通。具体可看代码,不过要真正地理解并查集的思想才容易明白。
以下代码是看过网上思路后自己重敲的,31msAC,不过刚开始写的时候没有在union函数中对a1、b1加相等的判断,导致死循环,TLE和stack overflow了好多次,输出的时候错把Yes打印为YES又WA了很多次。o(╯□╰)o
//模板开始#include <string> #include <vector> #include <algorithm> #include <iostream> #include <sstream> #include <fstream> #include <map> #include <set> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime>#include <iomanip>#include <string.h>#include <queue>#define SZ(x) (int(x.size()))using namespace std;int toInt(string s){istringstream sin(s); int t; sin>>t; return t;}template<class T> string toString(T x){ostringstream sout; sout<<x; return sout.str();}typedef long long int64;int64 toInt64(string s){istringstream sin(s); int64 t; sin>>t;return t;}template<class T> T gcd(T a, T b){ if(a<0) return gcd(-a, b);if(b<0) return gcd(a, -b);return (b == 0)? a : gcd(b, a % b);}//模板结束(通用部分)#define ifs cin#define MAX_SIZE 10005 int pa1[MAX_SIZE]; //存储有向图的边 int pa2[MAX_SIZE]; //存储有向图的边 void init() //初始化该函数可以根据具体情况保存和初始化需要的内容 { for(int i = 0; i < MAX_SIZE; i++) { pa1[i] = i; } for(int i = 0; i < MAX_SIZE; i++) { pa2[i] = i; } } int findset1(int x) { if(pa1[x] != x) { int root = findset1(pa1[x]); return pa1[x] = root; } else { return x; } }int findset2(int x) { if(pa2[x] != x) { int root = findset2(pa2[x]); return pa2[x] = root; } else { return x; } }void union_nodes1(int a, int b) //集合合并 { int a1 = findset1(a); int b1 = findset1(b);if(a1 != b1){pa1[a] = b; }}void union_nodes2(int a, int b) //集合合并 { int a1 = findset2(a); int b1 = findset2(b);if (a1 != b1){pa2[a] = b;} }//【图论04】有向图 1002 迷宫城堡int main(){//ifstream ifs("shuju.txt", ios::in);int n, m;int a, b;while(ifs>>n>>m && !(n == 0 && m == 0)){init();for(int i = 0; i < m; i++){//ifs>>a>>b;scanf("%d%d", &a, &b);if(a != n){union_nodes1(a, b); }if(b != n){union_nodes2(b, a);}}int flag = 1;for(int i = 1; i <= n - 1; i++){//cout<<findset1(i)<<findset2(i)<<endl;if(findset1(i) != n || findset2(i) != n){flag = 0;break;}}if(flag){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}return 0;}
- 【图论04】有向图 1002 迷宫城堡
- hdu1269 迷宫城堡 (强连通模板)(有向图)
- hdoj 1269 迷宫城堡 【有向图SCC 入门题目】
- HDU_P1269 迷宫城堡(有向图的强连通分量)
- hdu 1296 迷宫城堡【有向图scc+Tarjan入门】
- 有向图和无向图的连通性学习小记 Poj 1269 迷宫城堡
- HDU OJ 1269 迷宫城堡【有向图强连通分量的Tarjan算法 入门】
- HDU1269 迷宫城堡 有向图强连通分量Tarjan算法
- hdu 1269 迷宫城堡 tarjan算法求有向图的强连通分量
- HDU 1269 迷宫城堡 (有向图强连通分量Tarjan)
- hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法
- HDU 1269 迷宫城堡 (有向图的强连通分量)
- HDU 1269 -- 迷宫城堡【有向图求SCC的数目 && 模板】
- hdoj 迷宫城堡 1269 (有向图SCC) 入门题
- 【有向图的强连通分】HDUOJ 1269 迷宫城堡(Kosaraju算法+Tarjan算法)
- HDU ACM 1269迷宫城堡->有向强连通分量(tarjan算法实践)
- HDU1269——迷宫城堡(有向图求强连通分量,Tarjan算法)
- hdu1269-图论-Tarjan-迷宫城堡
- 网站
- Attach Android Source Code To Eclipse IDE-将Android 源码和Eclipse IDE 关联绑定起来-Git
- jqeury 链接超时
- 如何下载并编译Android 4.0内核源码Goldfish(图文)
- JVM 指令集总结
- 【图论04】有向图 1002 迷宫城堡
- 三种方法让TabBarController和NavigationController并存
- Unity内置编译器MonoDevelop C#脚本 中文的使用
- Android模拟器emulator基本使用技巧和命令
- 黑马程序员--03.Java面向对象--09.【Object类】
- OK6410 uboot1.16 出错 arm-none-linux-gnueabi-gcc: not found
- acm 1175 连连看
- 编写一程序,将两个字符串连接起来的3种方法
- 原型模式