P2456 - 膜拜神犇

P2456 - 膜拜神犇

Description

有一个 n 个点 m 条边的有向图, 蒟蒻可以从 1 号点出发在图上走, 并且最终需要回到 1 号点。 每个点都有一个神犇( 包括 1 号点), 每次经过一个没到过的点, 蒟蒻都会膜拜那位 神犇。 蒟蒻希望膜拜尽可能多的神犇。

由于蒟蒻膜拜神犇的欲望非常强烈, 所以他可以有一次机会逆着一条有向边的方向走。
( 需要注意的是, 这条边的方向不会改变)。

你现在想知道, 蒟蒻最多能膜拜多少神犇?

Input

第一行 2 个整数 n、 m, 分别表示图的点数和边数。

第 2 行到底 m+1 行, 每行两个整数 u,v, 描述一条 u 到 v 的有向边。

Output

一行一个整数表示蒟蒻最多能膜拜多少神犇。

Sample Input

7 10

1 2

3 1

2 5

2 4

3 7

3 5

3 6

6 5

7 2

4 7

Sample Output

6

Hint

数据范围:

对于 25%的数据, 保证 n<=100, m<=250,

对于 45%的数据, 保证 n<=3,000, m<=7,000。

对于 100%的数据, 保证 n,m<=100,000。

Source

图论

尽可能拜访尽量多的神犇,所以强连通分量缩点,变成了DAG,接下来,不存在环了,只存在从一个点到达另外一个点,走一条反向边,最回到一点,因此能不能回到1点,也就是反图能不能从1点出发到达这个点;同时,dis要尽量的大,因此spfa求最大值,枚举所有的点,与这个点相连的所有的边,就可以了;

  1 /* QYP kuai wo dai ma*/
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<iomanip>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<ctime>
 10 #include<cmath>
 11 #include<stack>
 12 #include<map>
 13 #include<set>
 14 #define rep(i,a,b) for(register int i=a;i<=b;i++)
 15 #define ll long long
 16 #define re register
 17 using namespace std;
 18 const int N=100010;
 19 struct Edge{
 20     int to,net;
 21 }e1[N],e2[N],e[N];
 22 int h1[N],h2[N],num_e1,num_e2,n,m,num_e,head[N];
 23 int g[N],ans,a[N],b[N];
 24 inline int gi() {
 25     re int res=0;
 26     char ch=getchar();
 27     while(ch<‘0‘||ch>‘9‘) ch=getchar();
 28     while(ch>=‘0‘&&ch<=‘9‘) res=res*10+ch-‘0‘,ch=getchar();
 29     return res;
 30 }
 31 inline void add1(int x,int y) {
 32     e1[++num_e1].to=y,e1[num_e1].net=h1[x],h1[x]=num_e1;
 33 }
 34 inline void add2(int x,int y) {
 35     e2[++num_e2].to=y,e2[num_e2].net=h2[x],h2[x]=num_e2;
 36 }
 37 inline void add(int x,int y) {
 38     e[++num_e].to=y,e[num_e].net=head[x],head[x]=num_e;
 39 }
 40 int low[N],dfn[N],dfs_clock,sccno[N],scc_cnt;
 41 stack<int>S;
 42 void Tarjan(int x) {
 43     low[x]=dfn[x]=++dfs_clock;
 44     S.push(x);
 45     for(int i=head[x];i;i=e[i].net) {
 46         int to=e[i].to;
 47         if(!dfn[to]) {
 48             Tarjan(to);
 49             low[x]=min(low[x],low[to]);
 50         }
 51         else if(!sccno[to]) low[x]=min(low[x],dfn[to]);
 52     }
 53     if(low[x]==dfn[x]) {
 54         ++scc_cnt;
 55         int u;
 56         for(;;) {
 57             u=S.top();S.pop();
 58             sccno[u]=scc_cnt;
 59             g[scc_cnt]++;
 60             if(u==x) break;
 61         }
 62     }
 63 }
 64 void SUO() {
 65     rep(i,1,n) if(!dfn[i]) Tarjan(i);
 66     for(int x=1;x<=n;x++)
 67         for(int i=head[x];i;i=e[i].net) {
 68             int to=e[i].to;
 69             if(sccno[to]!=sccno[x]) {
 70                 add1(sccno[x],sccno[to]),add2(sccno[to],sccno[x]);
 71             }
 72         }
 73 }
 74 bool inq[N];
 75 void spfa(int ss,int hh[],Edge ee[],int dis[]) {
 76     memset(inq,0,sizeof(inq));
 77     queue<int>q;
 78     dis[ss]=g[ss];
 79     q.push(ss);inq[ss]=1;
 80     while(!q.empty()) {
 81         int u=q.front();q.pop();
 82         inq[u]=0;
 83         for(int i=hh[u];i;i=ee[i].net) {
 84             int to=ee[i].to;
 85             if(dis[to] < dis[u] + g[to]) {
 86                 dis[to]=dis[u]+g[to];
 87                 if(!inq[to]) q.push(to),inq[to]=1;
 88             }
 89         }
 90     }
 91 }
 92 int main() {
 93      freopen("OrzOrz.in","r",stdin);
 94     freopen("OrzOrz.out","w",stdout);
 95     n=gi(),m=gi();
 96     rep(i,1,m) {
 97         re int u=gi(),v=gi();
 98         add(u,v);
 99     }
100     SUO();
101     spfa(sccno[1],h1,e1,a);
102     spfa(sccno[1],h2,e2,b);
103     for(int x=1;x<=scc_cnt;x++) {
104         for(int i=h1[x];i;i=e1[i].net) {
105             int to=e1[i].to;
106             if(a[to]&&b[x]) ans=max(ans,a[to]+b[x]);
107         }
108     }
109     if(ans==g[sccno[1]])
110         printf("%d ",ans);
111     else
112     printf("%d",ans-g[sccno[1]]);
113     return 0;
114 }

时间: 2024-10-06 08:03:40

P2456 - 膜拜神犇的相关文章

cogs 1656. 膜拜神犇

1656. 膜拜神犇 ★☆   输入文件:trioxorz.in   输出文件:trioxorz.out   简单对比时间限制:0.5 s   内存限制:128 MB [题目描述] bigmingod 是F.M.S信息组的组草,同时也是万人膜拜的神犇,整个年级暗恋他的女生不计其数,这让机房里的三只蒟蒻QYHDS,LZK,OIdiot羡慕嫉妒恨.为了获得像bigmingod一样的成就,这三只蒟蒻决定每次竞赛课前对他进行膜拜--三个人构成一个三角形,将bigmingod包围在内部(不包括边上),称为

P2300 合并神犇 DP

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的

【BZOJ4916】神犇和蒟蒻 杜教筛

[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 题解:哎?上面的那个东西好像一直是1?(废话),然后 设j=i/d,

bzoj4916 神犇和蒟蒻

Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 正解:杜教筛. 第一问答案是$1$. 第二问,先给个结论:$\varphi (n^{2})=n\va

[FZYZOJ 2132] Zrn神犇之一起来看流星雨

P2132 -- Zrn神犇之一起来看流星雨 时间限制:1000MS 内存限制:131072KB Description Zrn神犇带着妹纸来到异度空间看流星雨. 那儿有个矩形的星盘,一共有N*M格,流星雨都会落在那里.只是,那里的流星雨很奇特,都是很有节奏地.成排成排地落下的.每个时刻都会落下一排的流星,它们落在星盘上,形成了一个一个星群. 而Zrn神犇和妹纸对于星群的定义是不一样的.Zrn神犇认为,一颗星星和它周围的四个格子里的星星属于同一个星群.而妹纸认为,一颗星星和它周围的八个格子里的星

合并神犇

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的

[FZYZOJ 2162] Zrn神犇之折纸游戏

P2162 -- Zrn神犇之折纸游戏 时间限制:2000MS 内存限制:524288KB Description Zrn神犇最近喜欢上一款折纸游戏,因此他几乎每天都拿着一条悠长悠长又寂寥的纸带折来折去.其具体规则是这样的: 这是一个长度为N,宽度为1的纸条,从1开始写着连续的N个自然数. 1 2 3 4 5 6 … N 如果它的长度为偶数,Zrn神犇则会很高兴,直接把它从左往右或从右往左对折.比如长度为6的纸条从左往右对折完就会是这样: 如果它的长度为质数,Zrn神犇则会觉得不太爽,他就只能把

【BZOJ4916】神犇和蒟蒻(杜教筛)

[BZOJ4916]神犇和蒟蒻(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\mu(i^2)\ \ 和\ \sum_{i=1}^n\phi(i^2)\] 其中\[n<=10^9\] 题解 第一问 搞笑的 不会做? 算了.. 还是说一下: 想想\(\mu(x)\)是怎么算的??? 既然是\(i^2\),每个因数的个数一定不会是\(1\) 所以除了\(\mu(1)\)外一定都是\(0\) 所以第一问的答案一定是\(1\) 第二问: 先看看要求的是什么 \(\phi(i^2)=i*\ph

DP——P2300 合并神犇

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的