上白泽慧音

裸的tarjan。可是我有个问题 
不知道是数据太水还是我理解错了,我用一个没比字典序的程序竟然AC了,(这说明数据没有多种最大的的,我认为字典序输出是输出字典序小的 ,不是吗? )

下面是加字典序的代码 

#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
const int M=200000;
int head[M],to[M],nex[M];//数组模拟链表 
int tot;
int vis[M];
int zhan[M];
int t[M],s[M];
void add(int x,int y)//添加临接点 
{
    nex[++tot]=head[x];
    to[tot]=y;
    head[x]=tot;
}
int num;
int col[M];
int dfn[M];
int low[M];
int top;
int numc;
void tarjan(int x)
{
    dfn[x]=++num;
    low[x]=num;
    vis[x]=1;
    zhan[++top]=x;
    for(int i=head[x];i;i=nex[i])//枚举临接点 
    {
        int tmp=to[i];
        if(!dfn[tmp])   
        {
            tarjan(tmp);
            low[x]=min(low[x],low[tmp]);
        }
        else
        {
            if(vis[tmp]) low[x]=min(low[x],dfn[tmp]);
        }
    }
    if(low[x]==dfn[x])
    {
        numc++;
        while(zhan[top]!=x)//如果栈顶不为x出栈 
        {
            vis[zhan[top]]=0;
            col[zhan[top]]=numc; 
            t[numc]++;//强联通分量中有几个点
            s[numc]=min(numc,zhan[top]);//每个强联通分量找最小的 
            top--;
        }
        vis[x]=0;
        top--;
        col[x]=numc;
        t[numc]++; 
        s[numc]=min(x,s[numc]);// x出栈 
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
    int x,y,c;
    scanf("%d%d%d",&x,&y,&c);
    add(x,y);
    if(c==2) add(y,x);
    }
    for(int i=1;i<=n;i++)
    if(!dfn[i])
    tarjan(i);
    int max1=-1;
    int z;
    for(int i=1;i<=numc;i++)
    {
        if(t[i]>max1) max1=t[i],z=i;//找点最多的强联通分量记录下来编号 
    }
    for(int i=1;i<=numc;i++)
    {
        if(t[i]==max1&&s[i]<s[z])z=i;//找字典序最小的 
    }
    printf("%d\n",t[z]); //输出编号 
    for(int i=1;i<=n;i++)
    if(col[i]==z)
    printf("%d ",i);//输出 
    return 0;
}

转载于:https://www.cnblogs.com/wspl98765/p/6819882.html

改一下题面,标题自拟,要求把主角改成数学老师胡特。胡特精通数学领域,而且经常给同学们打鸡血 题面: ## 题目背景 上白泽在给雾之湖的妖精们讲课。 某天,在上数学课时,提到了一种非常有趣的记号:**高德纳箭号表示法**。它可以用来描述非常巨大的数字。~~比如紫的年龄。~~ 对于非负整数 $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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值