P1726 上白泽慧音 - 强连通分量模板

本文深入探讨了有向图的强连通分量(SCC)分析,通过Tarjan算法实现对有向图中最大强连通分量的寻找。代码示例详细展示了如何遍历所有节点,确保不遗漏任何可能的SCC,并通过比较不同SCC的大小和元素来确定最大分量。

虽然是模板但是却提醒我有向图一定要试着从每个点出发,不仅仅是因为图不一定连通,更有可能是只从1号点出发哪也去不了的情况

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 10000 + 10;
stack<int> s;
int n,m,vis[MAXN],last[MAXN],edge_tot,temp[MAXN],fina[MAXN],ans,dfn[MAXN],low[MAXN],flg[MAXN],cnt;
struct Edge{
	int u, v, w, to;
	Edge(){}
	Edge(int u, int v, int to) : u(u), v(v), to(to) {}
}e[50001 * 2];
inline void add(int u, int v) {
	e[++edge_tot] = Edge(u, v, last[u]);
	last[u] = edge_tot; 
}
bool cmp(int a, int b) {
	return a < b;
}
void tarjan(int x) {
	dfn[x] = low[x] = ++cnt;
	s.push(x);
	flg[x] = true;
	for(int i=last[x]; i; i=e[i].to) {
		int v = e[i].v;
		if(!dfn[v]) {
			tarjan(v);
			if(low[v] < low[x]) low[x] = low[v];
		} else if(dfn[v] < low[x] && flg[v]) {
			low[x] = dfn[v];
		}
	}
	if(dfn[x] == low[x]) {
		int j, num=0;
		do{
			j = s.top();
			s.pop();
			temp[++num] = j; 
			flg[j] = 0;
		}while(j != x);
		sort(temp+1, temp+num+1, cmp);
		if(num > ans) {
			memcpy(fina, temp, sizeof(temp));
			ans = num;
		} else if(num == ans) {
			if(memcmp(fina, temp, sizeof(temp)) > 0) 
				memcpy(fina, temp, sizeof(temp));
		}
	}
	
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i=1; i<=m; i++) {
		int a,b,t;
		scanf("%d%d%d",&a, &b, &t);
		add(a, b);
		if(t == 2) add (b, a);
	}
	for(int i=1; i<=n; i++) 
		if(!dfn[i]) //关键之处
			tarjan(i);
	printf("%d\n", ans);
	for(int i=1; i<=ans; i++) {
		printf("%d ", fina[i]);
	}
	return 0;
} 
请修改一下题面,题意不要发生改变,公式不要发生改变,将主人公换成中雅的数学老师胡特,多写一点,题目自拟 题面: ## 题目背景 上白泽在给雾之湖的妖精们讲课。 某天,在上数学课时,提到了一种非常有趣的记号:**高德纳箭号表示法**。它可以用来描述非常巨大的数字。~~比如紫的年龄。~~ 对于非负整数 $a, b$ 和正整数 $n$,高德纳箭号表示法的定义为: $$a \uparrow^n b = \begin{cases} 1\ (b = 0) \\ a^b\ (n = 1\ \operatorname{and}\ b > 0) \\ a \uparrow^{n - 1} (a \uparrow^n (b - 1))\ (n > 1\ \operatorname{and}\ b > 0) \end{cases}$$ 一些简单的例子: - $2 \uparrow 31 = 2^{31} = 2147483648$ - $2 \uparrow \uparrow 4 = 2^{2^{2^2}} = 2^{2^4} = 2^{16} = 65536$ 注: 1. $a \uparrow b$ 与 $a \uparrow^1 b$ 相同; 2. $a \uparrow \uparrow b$ 与 $a \uparrow^2 b$ 相同; 3. 请注意幂运算的顺序。 ## 题目描述 希望琪露诺解决以下关于 $x$ 的方程: $$a \uparrow^n x \equiv b \pmod p$$ 其中,$a, n, b, p$ 为已知的常数,$x$ 为未知数。 琪露诺被高德纳箭号表示法搞得云里雾里的,但是她不想被头槌。你能帮帮她吗? ## 输入格式 **本题有多组测试数据。** 第一行,一个整数 $T$,表示数据组数。 对于每组数据: 一行,四个整数 $a, n, b, p$。 ## 输出格式 对于每组数据,输出一行,一个整数,如果原方程有解,输出该方程的最小非负整数解;否则,输出 $-1$。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 2 1 1 3 3 1 2 7 7 1 2 4 ``` ### 输出 #1 ``` 0 2 -1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 3 2 2 4 7 3 2 4 6 5 2 1 3 ``` ### 输出 #2 ``` 2 -1 0 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 3 4 3 5 8 2 3 9 11 6 3 1 5 ``` ### 输出 #3 ``` -1 3 0 ``` ## 说明/提示 **本题开启捆绑测试。** | Subtask | $n$ | $p$ | $T$ | 分值 | 时限 | | :------: | :------: | :------: | :------: | :------: | :------: | | $1$ | $n = 1$ | $2 \leq p \leq 10^9$ 且 $p$ 为质数 | $1 \leq T \leq 100$ | $15 \operatorname{pts}$ | $2.00 \operatorname{s}$ | | $2$ | $n = 2$ | 无特殊限制 | $1 \leq T \leq 5 \times 10^3$ | $25 \operatorname{pts}$ | $1.00 \operatorname{s}$ | | $3$ | $n = 3$ | 无特殊限制 | 无特殊限制 | $60 \operatorname{pts}$ | $2.00 \operatorname{s}$ | 对于 $100\%$ 的数据,$1 \leq a \leq 10^9$,$1 \leq n \leq 3$,$0 \leq b < p \leq 10^9$,$1 \leq T \leq 2 \times 10^4$。
09-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值