当前位置:网站首页>图的底部问题
图的底部问题
2022-07-04 06:34:00 【chengqiuming】
一 原问题链接
The Bottom of a Graph - POJ 2553 - Virtual Judge
https://vjudge.net/problem/POJ-2553
二 输入和输出
1 输入
输入包含几个测试用例,每个测试用例都对应一个有向图G,每个测试用例都以整数 v开始,表示图 G 的节点数,节点编号为 1~v。接下来是非负整数e,然后是e对编号v1、w1、......ve、we,其中(vi,wi)表示一条边。在最后一个测试用例后跟着一个0.
2 输出
单行输出图底部的所有 sink 节点。如果没有,则输出一个空行。
三 输入和输出样例
1 输入样例
3 3
1 3 2 3 3 1
2 1
1 2
0
2 输出样例
1 3
2
四 问题分析
输入样例1,构建的图如下,图中 sink 节点为 1 和 3。

思路:求解强连通分量,并对强连通分量缩点,计算缩点的出度,出度为0 的强连通分量中的所有节点均为 sink 节点。
五 算法设计
1 先采用 Targan 算法求解有向图的强连通分量,标记强连通分量号。
2 检查每个节点 u 的每个邻接点 v,若强连通分量不同,则将 u 的连通分量号的出度加1。
3 检查每个节点 u,若其连通分量号的出度为0,则输出该节点。
六 代码
package graph.poj553;
import java.util.Scanner;
import java.util.Stack;
public class POJ2553 {
static final int maxn = 1000 + 5;
static int n;
static int m;
static int head[];
static int belong[];
static int out[];
static int cnt;
static int id;
static int low[];
static int dfn[];
static int num;
static Edge e[] = new Edge[maxn << 1];
static Stack<Integer> s = new Stack<>();
static boolean ins[] = new boolean[maxn];
static {
for (int i = 0; i < e.length; i++) {
e[i] = new Edge();
}
}
static void add(int u, int v) { // 添加一条边u--v
e[++cnt].next = head[u];
e[cnt].to = v;
head[u] = cnt;
}
static void tarjan(int u) { // 求强连通分量
low[u] = dfn[u] = ++num;
ins[u] = true;
s.push(u);
for (int i = head[u]; i != 0; i = e[i].next) {
int v = e[i].to;
if (dfn[v] == 0) {
tarjan(v);
low[u] = Math.min(low[u], low[v]);
} else if (ins[v]) {
low[u] = Math.min(low[u], dfn[v]);
}
}
if (low[u] == dfn[u]) {
int v;
do {
v = s.peek();
s.pop();
belong[v] = id;
ins[v] = false;
} while (v != u);
id++;
}
}
static void init() {
head = new int[maxn];
low = new int[maxn];
dfn = new int[maxn];
ins = new boolean[maxn];
belong = new int[maxn];
out = new int[maxn];
cnt = num = 0;
id = 1;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
n = scanner.nextInt();
if (n == 0) {
return;
}
m = scanner.nextInt();
init();
while (m-- != 0) {
int u, v;
u = scanner.nextInt();
v = scanner.nextInt();
add(u, v);
}
for (int i = 1; i <= n; i++)
if (dfn[i] == 0)
tarjan(i);
for (int u = 1; u <= n; u++)
for (int i = head[u]; i > 0; i = e[i].next) {
int v = e[i].to;
if (belong[u] != belong[v])
out[belong[u]]++;
}
int flag = 1;
System.out.println();
for (int i = 1; i <= n; i++)
if (out[belong[i]] == 0) {
if (flag == 1)
flag = 0;
else
System.out.print(" ");
System.out.print(i);
}
}
}
}
class Edge {
int to;
int next;
}七 测试
绿色为输入,白色为输出

边栏推荐
- How to implement cross domain requests
- What is Gibson's law?
- C實現貪吃蛇小遊戲
- Shopping malls, storerooms, flat display, user-defined maps can also be played like this!
- C realize Snake games
- Tar source code analysis 4
- Variables d'environnement personnalisées uniapp
- Common usage of time library
- Download kicad on Alibaba cloud image station
- Overview of convolutional neural network structure optimization
猜你喜欢

Arcpy uses the updatelayer function to change the symbol system of the layer

Detectron: train your own data set -- convert your own data format to coco format

Practical gadget instructions

云原生——上云必读之SSH篇(常用于远程登录云服务器)

24 magicaccessorimpl can access the debugging of all methods

746. Climb stairs with minimum cost

Cloud native - SSH article that must be read on the cloud (commonly used for remote login to ECS)

740. Delete and get points

After the festival, a large number of people change careers. Is it still time to be 30? Listen to the experience of the past people

Learn about the Internet of things protocol WiFi ZigBee Bluetooth, etc. --- WiFi and WiFi protocols start from WiFi. What do we need to know about WiFi protocol itself?
随机推荐
Sort list tool class, which can sort strings
2022年,或许是未来10年经济最好的一年,2022年你毕业了吗?毕业后是怎么计划的?
《ClickHouse原理解析与应用实践》读书笔记(4)
AWT introduction
Mysql 45讲学习笔记(十三)表数据删掉一半,表文件大小不变
R statistical mapping - random forest classification analysis and species abundance difference test combination diagram
tars源码分析之5
对List进行排序工具类,可以对字符串排序
Tree DP
Vant --- detailed explanation and use of list component in vant
The sorting in C language realizes the number sorting method from small to large
Considerations for testing a website
Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)
How to use multithreading to export excel under massive data? Source code attached!
2022 is probably the best year for the economy in the next 10 years. Did you graduate in 2022? What is the plan after graduation?
Code rant: from hard coding to configurable, rule engine, low code DSL complexity clock
Tsinghua University product: penalty gradient norm improves generalization of deep learning model
ADC voltage calculation of STM32 single chip microcomputer
Cloud native - SSH article that must be read on the cloud (commonly used for remote login to ECS)
How to realize multi account login of video platform members