队爷的讲学计划

问题描述

队爷为了造福社会,准备到各地去讲学。他的计划中有n 个城市,从 u 到 v 可能有一条单向道路,通过这条道路所需费用为 q。当队爷在 u 城市讲学完之后,u 城市会派出一名使者与他同行,只要使者和他在一起,他到达某个城市就只需要花 1 的入城费且只需交一次,在路上的费用就可免去。。但是使者要回到 u 城市,所以使者只会陪他去能找到回 u 城市的路的城市。。队爷从 1 号城市开始讲学,若他在u 号城市讲学完毕,使者会带他尽可能多的去别的城市。
他希望你帮他找出一种方案,使他能讲学到的城市尽可能多,且费用尽可能小。

输入文件

第一行 2 个整数 n,m。
接下来 m 行每行 3 个整数 u,v,q,表示从 u 到 v 有一条长度为 q的单向道路。

输出文件

一行,两个整数,为最大讲学城市数和最小费用。

数据规模与约定

对于 20%的数据,1<=n<=20;
对于另外 10%的数据,城市网络为一条单向链;
对于 60%的数据,1<=m<=200000
对于 100%的数据,1<=n<=100000
1<=m<=500000,1<=q<=1000, 保证无自环无重边。

分析

对于那些可以回到自己的点一定在一个强连通分量中,所以先用tarjan算法缩点重新建边之后得到一个DAG(有向无环图),可以用拓扑排序,也可以用spfa,这题数据不卡spfa。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=100010;
const int M=500010;
inline int read(){int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,m,tot,idx,top,cnt,ans;
int head[N],dis[N],u[M],v[M],w[M],f[N],g[N];
int dfn[N],low[N],sta[N],B[N],du[N],s[N];
bool instack[N];
queue<int>q;
struct node{int next,to,dist;
}e[M];
inline void ins(int from,int to,int dist){e[++tot].next=head[from];e[tot].to=to; e[tot].dist=dist;head[from]=tot;
}
void tarjan(int x){dfn[x]=low[x]=++idx;sta[++top]=x; instack[x]=true;for(int i=head[x];i;i=e[i].next)if(!dfn[e[i].to]){tarjan(e[i].to);low[x]=min(low[x],low[e[i].to]);}else if(instack[e[i].to])low[x]=min(low[x],dfn[e[i].to]);if(dfn[x]==low[x]){++cnt; int y;do{y=sta[top--];instack[y]=false;B[y]=cnt; ++s[cnt];}while(x!=y);}
}
void dfs(int x){for(int i=head[x];i;i=e[i].next)if(++du[e[i].to]==1) dfs(e[i].to);
}
int main(){freopen("teach.in","r",stdin);freopen("teach.out","w",stdout);n=read();m=read();for(int i=1;i<=m;++i){u[i]=read();v[i]=read();w[i]=read();ins(u[i],v[i],w[i]);}for(int i=1;i<=n;++i)if(!dfn[i]) tarjan(i);tot=0;memset(head,0,sizeof(head));for(int i=1;i<=m;++i)if(B[u[i]]!=B[v[i]])ins(B[u[i]],B[v[i]],w[i]);memset(g,0x3f,sizeof(0x3f));f[B[1]]=g[B[1]]=s[B[1]]; --g[B[1]];dfs(B[1]); q.push(B[1]);while(!q.empty()){int x=q.front();q.pop();for(int i=head[x];i;i=e[i].next){int to=e[i].to; --du[to];if(!du[to]) q.push(to);if(f[x]+s[to]>f[to]){f[to]=f[x]+s[to]; g[to]=g[x]+e[i].dist+s[to]-1;}else if(f[x]+s[to]==f[to])g[to]=min(g[to],g[x]+e[i].dist+s[to]-1);}}for(int i=1;i<=cnt;++i)if(f[i]>f[ans]) ans=i;else if(f[i]==f[ans]&&g[i]<g[ans]) ans=i;printf("%d %d\n",f[ans],g[ans]);return 0;
}

转载于:https://www.cnblogs.com/huihao/p/7786461.html

NOIP模拟赛 队爷的讲学计划相关推荐

  1. NOIP模拟赛 队爷的 Au Plan

    队爷的 Au Plan 问题描述 队爷为了变得越来越神,他给自己制定了 n 个任务,编号为 1,2,-,n.队爷在完成这些任务之前有一个初始兴奋值 m,每个任务都有一个难度值 hard[i],且对于任 ...

  2. 队爷的讲学计划 (强连通缩点+最短路)

    队爷的讲学计划 [问题描述] 队爷为了造福社会,准备到各地去讲学.他的计划中有n个城市,从u到v可能有一条单向道路,通过这条道路所需费用为q.当队爷在u城市讲学完之后,u城市会派出一名使者与他同行,只 ...

  3. 队爷的讲学计划(tarjan +拓扑排序)

    题目描述 队爷为了造福社会,准备到各地去讲学.他的计划中有n个城市,从u到v可能有一条单向道路,通过这条道路所需费用为q.当队爷在u城市讲学完之后,u城市会派出一名使者与他同行,只要使者和他在一起,他 ...

  4. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  5. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  6. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  7. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  8. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  9. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

最新文章

  1. python基础语法手册format-Python基础语法-格式化输出
  2. golang中的可见性
  3. 自己遇到oracle的错误记录
  4. java word 转换 图片_怎样把手机上的图片转换成word?
  5. linux 网络块存储,网络存储集群
  6. windows启动管理器_必备的9个Windows设置技巧,可以将Windows 10的性能大幅提高
  7. PCA计算点云的法线
  8. 应用chroot构建最小运行系统
  9. 思科模拟器Cisco Packet Tracer的下载与安装
  10. 贴片电阻各种封装规格及阻值标注方法
  11. JS清除IE浏览器缓存的方法
  12. Linux Thermal Framework分析及实施
  13. 了解前沿信息科技 做好学习就业规划
  14. Python3爬取前程无忧数据分析工作并存储到MySQL
  15. 大型医院HIS系统源码 优质源码 医院管理系统源码
  16. clojure 开发工具_Clojure Web开发–最新技术–第2部分
  17. Java后端返回Long类型数据与前端展示不一致(精度丢失)
  18. Java web--利用java操作excel文档
  19. 获得lazada商品详情
  20. 由安卓开发中的一个坑引发的问题解决之道浅析

热门文章

  1. performing vcs refresh卡住不动解决方法
  2. 【浙江大学】一个开源的知识图谱表示学习框架
  3. java anon,shiro anon 不生效
  4. #ACCV2022还有两周截稿#疫情过后期待相聚澳门,相邀参与亚洲视觉盛会
  5. 基于物理信息深度学习的交通状态估计:以LWR和CTM模型为例
  6. lly的数列询问(最小生成树 + 思维)
  7. java实现word(docx)在线编辑(word转html,html转word)——解读document.xml结构
  8. LaTex学习-安装
  9. 心理压力的测试软件,心理压力测量量表(WYB)
  10. 网易云信七鱼市场总监姜菡钰:实战解读增长黑客在B端业务的运用