Noip模拟 20161005友好城市

Posted aserrrre

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,m100n,m≤100

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

对于100%的数据,n,m100000

题目分析

我定睛一看就把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会懂得更多的。

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

以上是关于Noip模拟 20161005友好城市的主要内容,如果未能解决你的问题,请参考以下文章

20161005模拟

NOIP模拟2

Laoj P1659 noip模拟 - 道路规划(LCS的nlogn算法)

JZOJ5258.NOIP2017模拟8.11友好数对

计蒜客NOIP模拟赛4 D1T3 小X的佛光

计蒜客NOIP模拟赛D1T3 任性的国王