洛谷 P1807 最长路_NOI导刊2010提高(07) 题解
P1807 最长路_NOI导刊2010提高(07)
题目描述
设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。
输入格式
输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下来m行中每行输入3个整数a,b,v(表示从a点到b点有条边,边的长度为v)。
输出格式
输出文件longest.out,一个整数,即1到n之间的最长路径.如果1到n之间没连通,输出-1。
输入输出样例
输入 #1
2 1
1 2 1
输出 #1
1
说明/提示
20%的数据,n≤100,m≤1000
40%的数据,n≤1,000,m≤10000
100%的数据,n≤1,500,m≤50000,最长路径不大于10^9
【思路】
拓扑排序 + DP
这道题和今天考试的第二题有点像
不过这道题必须要求的1到n这两个点之间的最长路
所以不能吧入度为0的点都放进去
而是应该只放进去1
对其他的入度为0但是不是1的点怎么处理呢?
枚举完1能到达的点并且减去入度之后
这些点不一定会为0
所以需要将那些多余的点删掉
这里的删掉指的是入度--
也就是把除了1以外的入度为0的点
进行拓扑排序
拓扑排序到的点就入度--
入度为0还是想像正常的拓扑一样放入栈/队列中去
直到栈/队列为空
然后再来一遍拓扑排序
只将1放入栈/队列中,
因为起点只能是1
在排序的过程中
可以进行DP
dp[i]表示i这个点到1的最长的距离
dp[i] = max(dp[i],dp[u] + w);
表示i这个点到1的最长距离等于max(它本身的值,他前一个点到1的最长距离+他和她前一个点之间的距离)
最后如果dp[n] == 0
也就是没有到达这个点
那就输出-1
否则输出dp[n]
【完整代码】
#include<iostream>
#include<cstdio>
#include<stack>
#define int long long
using namespace std;
const int Max = 50005;
struct node
{
int y,w,ne;
}a[Max];
int head[1505],sum = 0;
int into[1505];
void add(int u,int v,int w)
{
a[++ sum].y = v;
a[sum].ne = head[u];
a[sum].w = w;
head[u] = sum;
}
stack<int>s;
int dp[1505];
stack<int>q;
signed main()
{
int n,m;
cin >> n >> m;
int u,v,w;
for(register int i = 1;i <= m;++ i)
{
cin >> u >> v >> w;
add(u,v,w);
into[v] ++;
}
int jj = 0;
for(register int i = 1;i <= n;++ i)
if(into[i] == 0 && i != 1)
q.push(i);
while(!q.empty())
{
int u = q.top();
q.pop();
for(register int i = head[u];i != 0;i = a[i].ne)
{
into[a[i].y] --;
if(into[a[i].y] == 0)q.push(a[i].y);
}
}
s.push(1);
while(!s.empty())
{
int u = s.top();
s.pop();
for(register int i = head[u];i != 0;i = a[i].ne)
{
dp[a[i].y] = max(dp[a[i].y],dp[u] + a[i].w);
into[a[i].y] --;
if(into[a[i].y] == 0)s.push(a[i].y);
}
}
if(dp[n] == 0)cout << -1;
else cout << dp[n] << endl;
return 0;
}
洛谷 P1807 最长路_NOI导刊2010提高(07) 题解的更多相关文章
- 洛谷 P1807 最长路_NOI导刊2010提高(07)
最长路 #include <iostream> #include <cstdio> #include <cstring> #include <queue> ...
- 洛谷 P1807 最长路_NOI导刊2010提高(07)题解
相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...
- 洛谷P1807 最长路_NOI导刊2010提高(07)
//拓扑排序求最长路 #include<bits/stdc++.h> #include<queue> using namespace std; const int INF=0x ...
- 图论--最长路--洛谷P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- luogu P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入输出 ...
- 【luogu P1807 最长路_NOI导刊2010提高(07)】 题解
题目链接:https://www.luogu.org/problemnew/show/P1807 求最大路?就是把权值取相反数跑最短路. #include <cstdio> #includ ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
- 洛谷P1771 方程的解_NOI导刊2010提高(01)
题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...
随机推荐
- Java内存模型——方法区
方法区(Method Area) ① 对每个加载的类型,JVM必须在方法区中存储以下类信息: 1) 这个类型的完整有效名(类型信息) 类型名称在Java类文件和JVM中都以完整 ...
- "超时时间已到。在操作完成之前超时"的解决思路
错误往往是数据库操作超时引起 1.检查数据库访问连接字符串启用连接池,若是,适当增大超时时间 2.ADO sqlcommand相应调整超时时长 3.关键在于优化数据库操作,优化压缩执行时间
- NEST routing timeout scroll
/// <summary> /// PUT /employee/employee/9e5e50da-7740-488e-bee2-b24951435691?routing=test_rou ...
- 有关Nodejs的一些插件介绍
var child_process = require('child_process');这个可以执行cmd的命令 child_process.exec(cmdLine, function(error ...
- 压测工具wrk的编译安装与基础使用
Linux上编译安装: [root@centos ~]# cd /usr/local/src [root@centos ~]# yum install git -y [root@centos ~]# ...
- springboot+security整合(3)自定义鉴权
说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...
- js 数组 数组 最大值、最小值 算法(转载)
一:https://www.cnblogs.com/zhouyangla/p/8482010.html 1.排序法 首先我们给数组进行排序,可以按照从小到大的顺序来排,排序之后的数组中第一个和最后一个 ...
- CentOS上使用ntfs-3g挂载NTFS分区
U盘做过系统盘,是NTFS格式的,Centos7竟然不识别,而且因为一些原因,我的服务器没有联网,只能用U盘 查过资料才知道Centos7上默认是不支持挂载NTFS格式的分区的,需要安装ntfs-3g ...
- GAE相关
Google App Engine for Java是可以在Google托管服务器基础架构上托管和运行用户Web应用程序.出于安全原因,这些应用程序在沙盒环境中执行. 沙箱本身由两层组成.第一层是GA ...
- Spring Boot SockJS应用例子
1.SockJS用javascript实现的socket连接,兼容各种浏览器的WebSocket支持库2.WebSocket是H5的,不支持H5的浏览器没法使用.3.SockJS它提供类似于webso ...