码迷,mamicode.com
首页 > 其他好文 > 详细

【Noip模拟 20161005】友好城市

时间:2019-03-20 00:42:31      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:reg   整数   cin   题目   最大   stack   stdout   color   struct   

问题描述

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】友好城市

标签:reg   整数   cin   题目   最大   stack   stdout   color   struct   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!