【题目描述】

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

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

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

【输入格式】

输入到OrzOrz.in

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

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

【输出格式】

输出到OrzOrz.out

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

【样例输入】

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

【样例输出】

6

【提示】

【数据范围】

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

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

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

【来源】

QBXT春令营精英班第一次测试T2

先tarjan缩一波点

那么图变成了一个DAG

考虑一条边被反转的贡献 是从1到这条边终点最长路+从1到这条边起点最长路-1号点所在scc点数

最长路用spfa跑

时间复杂度O(n*玄学)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int maxn=100000+10;
vector<int>A[maxn];
vector<int>G[maxn];
vector<int>RG[maxn];
int f[maxn],g[maxn];
int s[maxn];
int dfn[maxn],low[maxn];
int ins[maxn];
int ind=0;
int edge=1;
int vis[maxn];
int size[maxn];
int top=0;
int fa[maxn];
queue<int>q;
inline void tarjan(int x){dfn[x]=low[x]=++ind;s[++top]=x;ins[x]=1;for(int i=0;i<A[x].size();i++){int u=A[x][i];if(!dfn[u]){tarjan(u);low[x]=min(low[x],low[u]);}else if(ins[u])low[x]=min(low[x],dfn[u]);}if(low[x]==dfn[x]){while(s[top]!=x){size[x]++;fa[s[top]]=x;ins[s[top]]=0;top--;}size[x]++;ins[x]=0;fa[x]=x;top--;}
}
int main(){freopen("OrzOrz.in","r",stdin);freopen("OrzOrz.out","w",stdout);int n,m;scanf("%d %d",&n,&m);int x,y;for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);A[x].push_back(y);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=n;i++)for(int j=0;j<A[i].size();j++)if(fa[i]!=fa[A[i][j]]){G[fa[i]].push_back(fa[A[i][j]]);RG[fa[A[i][j]]].push_back(fa[i]);;}q.push(fa[1]);memset(f,-127/2,sizeof(f));memset(vis,0,sizeof(vis));f[fa[1]]=size[fa[1]];   vis[fa[1]]=1; while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<G[x].size();i++){int u=G[x][i];if(f[u]<f[x]+size[u]){f[u]=f[x]+size[u];if(!vis[u]){vis[u]=1;q.push(u);}}}vis[x]=0;}q.push(fa[1]);memset(g,-127/2,sizeof(g));memset(vis,0,sizeof(vis));g[fa[1]]=size[fa[1]];while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<RG[x].size();i++){int u=RG[x][i];if(g[u]<g[x]+size[u]){g[u]=g[x]+size[u];if(!vis[u]){vis[u]=1;q.push(u);}}}vis[x]=0;}int ans=size[fa[1]];for(int i=1;i<=n;i++){if(fa[i]!=i)continue;for(int j=0;j<G[i].size();j++){int u=G[i][j];if(g[i]+f[fa[u]]-size[fa[1]]>ans)ans=g[i]+f[fa[u]]-size[fa[1]];}}printf("%d\n",ans);//for(int i=1;i<=n;i++)//   printf("%d\n",g[i]);
return 0;
}

qbxt集训cogs2682. 膜拜相关推荐

  1. 7.6~7.20集训总结(一)

    7.6~7.20集训总结(一) 这次暑假集训呢, 感觉收获很多,在大佬们的碾压下也感受到了自己的不足,掌握的知识还不牢固,需要多加巩固! 此外,膜拜一下qt苣佬, 看了qt苣佬的博客,发现自己是如此的 ...

  2. 清北NOIP训练营集训笔记——图论(提高组精英班)

    清北NOIP训练营集训笔记--图论(提高组精英班) 本文摘自清北学堂内部图论笔记,作者为潘恺璠,来自柳铁一中曾参加过清北训练营提高组精英班,笔记非常详细,特分享给大家!更多信息学资源关注微信订阅号no ...

  3. 2016暑假集训总结

    Preface 这是蒟蒻lyd729在初二升初三的暑假里训练的总结. 来看看一年前的lyd729写的暑假集训总结(链接),真是觉得自己长大了好多. 这一年发生了太多故事.(我来讲故事啦) 去年,一升初 ...

  4. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

  5. 【Never Stop】联赛集训记录

    始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...

  6. WC2018集训 吉老师的军训练

    WC2018集训 吉老师的军训练 #include<bits/stdc++.h> #define RG register #define IL inline #define _ 20000 ...

  7. iOS-仿膜拜贴纸滚动(物理仿真)

    导读 简单用OC写了一个小球滚动效果; 类似平衡球. GitHub地址:https://github.com/wangliujiayou/WLBallView 欢迎Star. 膜拜滚动 进入正题-(传 ...

  8. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  9. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

最新文章

  1. [Ops]阿里云服务器上无法发送邮件的现象原因及解决
  2. [swift] Async
  3. 01-缓存一致性---基础知识
  4. 一起认识FileShare
  5. volatile与synchronized 同步原理基础讲解
  6. java 开发帮助_java的简单编程请帮助
  7. 【通俗易懂】手把手带你实现DeepFM!
  8. android 继承现有控件,Android继承现有控件拓展实现自定义控件textView
  9. LightGBM大战XGBoost,谁将夺得桂冠?
  10. asp.net中日志框架Log4Net的使用
  11. 泛型使用思想,记一次java泛型使用经历
  12. php 密匙加密解密,带密匙的php加密解密示例分享
  13. updateStateByKey算子入门案例
  14. SnackbarUtils:一行代码搞定Snackbar
  15. plc编程及应用_常见进制在PLC编程中的应用,学PLC必备~
  16. Kindle3 字典安装
  17. 生成密钥、配送密钥和更新密钥
  18. QT 控件增加双击事件
  19. UE官网ARPG游戏学习笔记1
  20. 项目无法启动,Disconnected from the target VM

热门文章

  1. cPanel主机空间安装Magento规范准确详细教程
  2. java中从1到101的素数_「1是不是质数」在c#中完成1到10的素数(1不是素数) - seo实验室...
  3. Django的ManyToManyField(多对多)的使用以及through的作用
  4. 必做作业2:视频剪辑软件调研
  5. 动态RAM的基本单元电路
  6. 七月在线 《图像识别与检测》
  7. 苹果公司创始人乔布斯生平简介
  8. 解决网页不能粘贴的问题
  9. 结构光三维测量几种比较成熟的方法
  10. 开放信息抽取(OIE)系统(四)-- 第三代开放信息抽取系统(基于子句, clause-based, 句子重组、删减)