Code[vs] 1506传话(tarjan缩点)
来源:互联网 发布:龙虎榜数据每天几点出 编辑:程序博客网 时间:2024/05/16 06:01
http://codevs.cn/problem/1506/
这道题就是问每个点是否存在于一个环里面,所以用tarjan跑一遍,然后检查他所在的强联通分量里面是否存在多于一个的变量数目。若变量数目大于1,输出T,否则输出F
代码如下:
#include<bits/stdc++.h>using namespace std;int n, m;vector <int> G[1005], com[1005];int dfn[1005], low[1005], key[1005];int ind, com_num;int in[1005];stack <int> s;void tarjan(int x) {key[x] = 2;dfn[x] = low[x] = ind++;s.push(x);for(int i = 0; i < G[x].size(); i++) {int v = G[x][i];if(dfn[v] == -1) {tarjan(v);dfn[x] = min(dfn[x], dfn[v]);} else if(key[v] == 2) {dfn[x] = min(dfn[x], low[v]);}}if(dfn[x] == low[x]) {while(1) {int t = s.top();s.pop();in[t] = com_num;com[com_num].push_back(t);key[t] = 1;if(t == x)break;}com_num++;}}int main() {int a, b;memset(dfn, -1, sizeof(dfn));memset(low, -1, sizeof(low));int n, m;cin >> n >> m;while(m--) {scanf("%d%d", &a, &b);G[a].push_back(b);}for(int i = 1; i <= n; i++)if(dfn[i] == -1)tarjan(i);for(int i = 1; i <= n; i++) {if(com[in[i]].size() > 1)cout << "T" << endl;elsecout << "F" << endl;}return 0;}
阅读全文
0 0
- Code[vs] 1506传话(tarjan缩点)
- 【codevs】1506 传话 Tarjan
- codevs1506传话(tarjan)
- codevs 1506 传话 Tarjan 解题报告
- POJ2186(Tarjan缩点)
- 1506传话
- poj2186 Popular Cows(tarjan + 缩点)
- poj Popular Cows(tarjan +缩点)
- POJ2186--Popular Cows(Tarjan+缩点)
- Network(Tarjan+缩点+LCA)
- UOJGraph(tarjan缩点+拓扑)
- hihocoder 1185(tarjan缩点)
- [HDU2767]Proving Equivalences(Tarjan缩点)
- 【HDU1827】Summer Holiday(Tarjan缩点)
- POJ-1236(tarjan缩点)
- POJ-3177(tarjan缩点)
- tarjan算法缩点构图(模板)
- luogu1262 间谍网络(tarjan缩点)
- [数论]线性求所有逆元的方法
- 慢查询日志详解
- 实现简单的万年历
- fatfs 学习笔记--f_write用法(最新版本R0.13)
- nginx缓存页面+cookie后 串会话问题
- Code[vs] 1506传话(tarjan缩点)
- UVA 116 Unidirectional TSP(动态规划)
- PreparedStatement和Statement的区别
- 什么是jquery
- Bootstrap图标菜单按钮组件
- mysql decimal
- 数据结构实验之排序五:归并求逆序数
- linux-windows下串口编程(主要是linux下通过串口进行烧写hex)
- Unity3D学习记录——碰撞变色