【Noip模拟 20161005】友好城市

问题描述

小ww生活在美丽的ZZ国。ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii、jj的公路只能从ii连到jj)。城市ii、jj是友好城市当且仅当从城市ii能到达城市jj并 且从城市jj能到达城市ii。如果kk个城市两两互为友好城市,那么我们称这kk个城市是友好 城市群,kk为友好城市群的大小。现在小ww想知道友好城市群的大小最大为多少,你能告诉 他吗?

输入格式

第一行包含两个整数nn 和mm。

接下来mm 行,每行两个整数ii和jj,表示有从城市ii到城市jj的一条单向公路。

输出格式

共一行一个整数表示答案。

输入样例

10 12
3 7
1 2
4 5
7 10
10 8
6 8
2 1
3 8
10 3
6 8
7 3
4 1

输出样例

3

数据范围

对于30%的数据,n,m≤100n,m≤100

对于80%的数据,n≤1000, m≤100000n≤1000, m≤100000

对于100%的数据,n,m≤100000

题目分析

我定睛一看就把Tarjan这糟老头子拽出来了:你特么又变着法子考我?然后我就写完了代码,下面献上。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define IL inline
#define int long long
#define RE register int
#define N 100001
int m,n,cnt,tim,ans;
int head[N],dfn[N],low[N];
stack<int>s;
bitset<N>vis;
struct aa{int v,next;}e[N<<1];
IL void addedge(RE u,RE v){
    e[++cnt]=(aa){v,head[u]},head[u]=cnt;
}IL void Tarjan(RE u){
    dfn[u]=low[u]=++tim,vis[u]=1,s.push(u);
    for (RE v,i=head[u];i;i=e[i].next){
        if (!dfn[v=e[i].v]) Tarjan(v),low[u]=min(low[u],low[v]);
        else if (vis[v])    low[u]=min(low[u],dfn[v]);
    }if (dfn[u]==low[u]){
        RE sum=0;
        do{++sum,vis[s.top()]=0,s.pop();}while(s.top()^u);
        ans=max(ans,sum);
    }
}
signed main(){
//    freopen("friend.in","r",stdin),freopen("friend.out","w",stdout);
    cin>>n>>m;
    for (RE i=1,u,v;i<=m;++i)
        cin>>u>>v,addedge(u,v);
    for (RE i=1;i<=n;++i) if (!dfn[i]) Tarjan(i);
    cout<<ans;
}

代码分析

第一次交没有AC,因为我们的评测机爆炸了。注意退栈的操作,这一题不需要缩点,大家学了网络流对Tarjan会懂得更多的。

我还要写什么呢,睡觉去了,整个晚上都没有和她联系,有点孤单。

原文地址:https://www.cnblogs.com/aserrrre/p/10562415.html

时间: 2024-10-13 00:44:25

【Noip模拟 20161005】友好城市的相关文章

【Noip模拟 20161005】公约数

问题描述 小ww最近仔细研究了公约数,他想到了以下问题:现有nn个正整数,从中选k(2≤k≤n)k(2≤k≤n) 个,设这kk个数的最大公约数为gg,则这kk个数的价值为k×gk×g.求这个价值的最大值. 小ww 当然知道答案了.现在他想考考你,你能很快回答出来吗? 输入格式 第一行,一个整数nn. 第二行,nn个正整数. 输出格式 一行一个正整数,表示答案. 输入样例 5 4 6 3 8 9 输出样例 9 数据范围 对于30%数据,n≤100n≤100 对于100%数据,n≤200000n≤2

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

拦截导弹;合唱队形;友好城市——基本的单调序列动态规划吧

合集,三个题目基本上都一样.耗时也不贴了. 拦截导弹: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=128; 5 int n=1,val[N]; 6 int up[N],dn[N],cnt1,cnt2; 7 int main(){ 8 for(int i=0;i<N;i++)up[i]=dn[i]=1; 9 while(cin>>val[n])n++;n-

洛谷P2782 友好城市

题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.没对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故.编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多. 输入输出格式 输入格式: 第1行,一个整数N(1<=N<=5000),表示城市数. 第2行到第n+1行,每行两个整数,

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

洛谷 2782友好城市

题目背景 无 题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.没对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故.编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多. 输入输出格式 输入格式: 第1行,一个整数N(1<=N<=5000),表示城市数. 第2行到第n+1行,

P2782 友好城市

题目背景 无 题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.没对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故.编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多. 输入输出格式 输入格式: 第1行,一个整数N(1<=N<=5000),表示城市数. 第2行到第n+1行,

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻