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

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

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

样例输入
6 6
1 2 3
2 3 7
2 6 4
3 4 5
4 5 4
5 2 3

样例输出
6 10

提示
如上图,从1走到2,2城市使者会带他到3,4,5城市,回到2城市,再走到6,总费用为3+3+4=10。

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

思路
tarjan缩点后跑拓扑排序得解

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=500005;
const int M=500005;
const int INF=0x3f3f3f3f;
const ll LINF=1e18;
const ull sed=31;
const ll mod=998244353;
const double eps=1e-7;
const double PI=3.14159265358979;
typedef pair<int,int>P;
typedef pair<double,double>Pd;struct node
{int to,index,w;
}E[M];
int eu[M],ev[M],ew[M];
int n,m,cnt,head[N];
int Stack[N],dfn[N],low[N],tot,dep,top;
int ltp[N],ltps[N];
int deg[N],num[N],val[N];
bool viss[N];
queue<int>q;void add(int u,int v,int w)
{E[++cnt].to=v;E[cnt].index=head[u];E[cnt].w=w;head[u]=cnt;
}void tarjan(int u)
{dfn[u]=low[u]=++dep;Stack[++top]=u;viss[u]=true;for(int i=head[u];i;i=E[i].index){if(!dfn[E[i].to]){tarjan(E[i].to);low[u]=min(low[u],low[E[i].to]);}else if(viss[E[i].to]) low[u]=min(low[u],dfn[E[i].to]);}if(dfn[u]==low[u]){++tot;int v;do{v=Stack[top--];viss[v]=false;ltp[v]=tot;++ltps[tot];}while(u!=v);}
}void dfs(int u)
{for(int i=head[u];i;i=E[i].index)if(++deg[E[i].to]==1) dfs(E[i].to);
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<m;i++){scanf("%d%d%d",&eu[i],&ev[i],&ew[i]);add(eu[i],ev[i],ew[i]);}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);memset(head,0,sizeof(head));cnt=0;for(int i=0;i<m;i++)if(ltp[eu[i]]!=ltp[ev[i]])add(ltp[eu[i]],ltp[ev[i]],ew[i]);dfs(ltp[1]);memset(val,0x3f,sizeof(val));num[ltp[1]]=val[ltp[1]]=ltps[ltp[1]];val[ltp[1]]--;q.push(ltp[1]);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=E[i].index){int v=E[i].to;deg[v]--;if(deg[v]==0) q.push(v);if(num[v]<num[u]+ltps[v]){num[v]=num[u]+ltps[v];val[v]=val[u]+E[i].w+ltps[v]-1;}else if(num[v]==num[u]+ltps[v]) val[v]=min(val[v],val[u]+E[i].w+ltps[v]-1);}}int ans=0;for(int i=1;i<=cnt;i++){if(num[ans]<num[i]) ans=i;else if(num[i]==num[ans] && val[i]<val[ans]) ans=i;}printf("%d %d\n",num[ans],val[ans]);return 0;
}

队爷的讲学计划(tarjan +拓扑排序)相关推荐

  1. NOIP模拟赛 队爷的讲学计划

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

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

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

  3. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  4. P1137-旅行计划【拓扑排序,DAGdp】

    正题 题目链接:https://www.luogu.org/problemnew/show/P1137 题目大意 一张有向无环图,求以每个点为终点的最长路径. 解题思路 先拓扑排序,然后dpdpdp ...

  5. 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    https://www.luogu.org/problem/show?pid=3119 本来我是来练习tarjan的,结果tarjan部分直接copy了,反而拓扑排序部分想了好久: 这道题SZB大神两 ...

  6. hdu6165(拓扑排序+tarjan缩点)

    题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...

  7. 【拓扑排序】【DP】旅行计划(luogu 1137)

    旅行计划 luogu 1137 题目大意: 有一堆点,之间连接着一些边(有向),保证无环,现在要求出从任意地方出发到所有点的最长路(出发点不一定相同) 原题: 题目描述 小明要去一个国家旅游.这个国家 ...

  8. 【POJ - 2762】Going from u to v or from v to u?(Tarjan缩点,树形dp 或 拓扑排序,欧拉图相关)

    题干: In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms ...

  9. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)

    题干: 问题描述 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员 ...

最新文章

  1. 从零开始的AI·机器学习の基本概念
  2. 里面有面和点_鲜虾韭菜水晶饺,皮薄馅大,晶莹剔透,一不小心就变成了面点高手...
  3. Android之在ubuntu上过滤多条关键字日志
  4. spring rmi_Spring集成–使用RMI通道适配器
  5. 父亲的忠告:把孩子培养成普通人
  6. 95-190-540-源码-window-清除器(Evictors)-TimeEvitor简介
  7. Python版冒泡法排序算法
  8. 赛锐信息:SAP安全漏洞审计及工具介绍
  9. 火狐浏览器读取ukey_火狐 83版引入HTTPS-Only模式 确保访问安全连接
  10. 基于springboot的学生选课系统
  11. NGFF(M.2) m.2中Bkey接口Mkey接口有什么不同
  12. Head First Java习题练习(二)
  13. 2018会考计算机知识点,2018高中地理会考知识点总结:地理信息技术
  14. xul 和xml区别_使用Atom XML和Firefox XUL实施Web剪切和粘贴
  15. PCIE 转 spi 总线
  16. k8s 二进制高可用集群部署
  17. leetcode(19):Anagrams (字谜游戏)
  18. 很多时候,你不得不被生活的种种琐事所牵绊
  19. 快速创建ROS2 packages
  20. 深度学习网络结构图绘制工具及方法

热门文章

  1. php gd表情包,gd表情包
  2. 【con】rounded不起作用(前端bug日记3)
  3. MySQL错误ERROR 1045 (28000): Access denied for user 'root'@'localhos
  4. 《自己动手写CPU》--第九章--学习笔记
  5. 软件构造实验一问题解决方法及经验教训
  6. 01-JAVA基础—>赏金任务—>三色球问题
  7. 【笔记整理】vue.js笔记
  8. 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
  9. kaggle 注册无法激活的问题解决
  10. hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)