HDU6165(tarjan算法 强连通缩点,拓扑排序)
来源:互联网 发布:matlab 稀疏矩阵转换 编辑:程序博客网 时间:2024/06/10 05:39
这里说明一下,tarjan是一个人,他发明的算法都以他命名,所以,tarjan后面要加后缀,不然不知道是哪个算法。
一道比较标准的模板题,这里有篇很好的讲强 tarjan求强连通分量 的博客点击打开链接
我这里直接把新图构建出来了,然后拓扑排序即可,只要那一层出现两个入度为0的点即不能到达。
#include<iostream>#include<vector>#include<algorithm>#include<cstdio>#include<cstring>#include<stack>using namespace std;int T,n,m;int sccn,dfni;int scc[1005],dfn[1005],low[1005];vector<int> mp[1005],newmp[1005];stack<int> stac;int instac[1005];void init() {sccn=0;dfni=1;memset(low,0,sizeof(low));memset(scc,0,sizeof(scc));memset(instac,0,sizeof(instac));memset(dfn,0,sizeof(dfn));for(int i=1;i<=n;i++) {mp[i].clear();} }void tarjan(int p) {dfn[p]=low[p]=dfni;dfni++;instac[p]=1;stac.push(p);for(int i=0;i<mp[p].size();i++) {int v=mp[p][i];if(dfn[v]==0) {tarjan(v);if(low[v]<low[p]) low[p]=low[v];}else if(instac[v]&&dfn[v]<low[p]) {low[p]=dfn[v];}}if(dfn[p]==low[p]) {sccn++;int te=0;while(te!=p) {te=stac.top();scc[te]=sccn;instac[te]=0;stac.pop();}}}bool visit[1005][1005];//新图以scc为单位 void newmap() {memset(visit,0,sizeof(visit));for(int i=1;i<=sccn;i++) {newmp[i].clear();}for(int i=1;i<=n;i++) {for(int j=0;j<mp[i].size();j++) {if(scc[i]!=scc[mp[i][j]]&&visit[scc[i]][scc[mp[i][j]]]==0) {newmp[scc[i]].push_back(scc[mp[i][j]]);visit[scc[i]][scc[mp[i][j]]]=1;} }}}int degree[1005],pi,pnum;int toposort() {memset(degree,0,sizeof(degree));for(int i=1;i<=sccn;i++) {for(int j=0;j<newmp[i].size();j++) { degree[newmp[i][j]]++;}}while(1) {pi=0,pnum=0;for(int i=1;i<=sccn;i++) {if(degree[i]==0) {pnum++;pi=i;} } if(pnum==0) { return 1;}else if(pnum>=2) {return 0;}else if(pnum==1) {degree[pi]=-1;for(int i=0;i<newmp[pi].size();i++) {degree[newmp[pi][i]]--;}}}return 1;}int main() {//freopen("fuck.txt","r",stdin);scanf("%d",&T);while(T--) {scanf("%d%d",&n,&m);init();for(int i=1;i<=m;i++) {int u,v;scanf("%d%d",&u,&v);mp[u].push_back(v);}for(int i=1;i<=n;i++) {if(scc[i]==0) {tarjan(i);}}newmap();if(toposort()) {printf("I love you my love and our love save us!\n");}else {printf("Light my fire!\n");}}return 0;}
阅读全文
0 0
- HDU6165(tarjan算法 强连通缩点,拓扑排序)
- poj 2762 强连通缩点+拓扑排序
- UVA 11770 Lighting Away 强连通缩点+拓扑排序
- 强连通分量(强连通缩点(tarjan))+最小路径覆盖(匈牙利算法)
- 模板_tarjan强连通缩点算法
- POJ 1236 Network of Schools【强连通缩点】【Tarjan算法】
- 强连通缩点
- 强连通缩点
- hdu6165 FFF at Valentine【强联通缩点+拓扑排序】
- POJ 2762 证明是否为单向连通图 强连通缩点+类拓扑排序
- zoj 3795 Grouping 强连通缩点+拓扑排序最长链
- POJ 2762判断单联通(强连通缩点+拓扑排序)
- POJ 1236 Network of Schools tarjan强连通缩点
- poj2186 第一道Tarjan强连通缩点
- LA 4287 Proving Equivalences(tarjan+强连通缩点)
- HDU 2767 Proving Equivalences Tarjan 强连通缩点
- HDU2767 强连通缩点
- poj1236强连通缩点
- JDK&AS安装
- What is "computing,计算机发展史
- 572. Subtree of Another Tree 子树的判定
- 如何运行vue项目
- HDOJ 2717
- HDU6165(tarjan算法 强连通缩点,拓扑排序)
- spark 入门
- 使用spring的test模块模拟MVC请求的方法
- Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistL
- 爬取豆瓣的战狼影评(cookies 云词)
- 安装、使用 Mysql
- 实例展示elasticsearch集群生态,分片以及水平扩展
- 集成学习
- 最大公约数