首页 > 其他分享 >洛谷P1807 最长路(拓扑排序)

洛谷P1807 最长路(拓扑排序)

时间:2025-01-19 14:02:27浏览次数:3  
标签:ch 洛谷 idx int 拓扑 ++ P1807 read dis

题目链接P1807 最长路 - 洛谷 | 计算机科学教育新生态

题目描述

设 G 为有 n 个顶点的带权有向无环图,G  中各顶点的编号为 1 到 n,请设计算法,计算图 GG中 1,n 间的最长路径。

输入格式

输入的第一行有两个整数,分别代表图的点数 n 和边数 m。

第 2 到第 (m+1) 行,每行 33 个整数 u,v,w(u<v),代表存在一条从 u到 v 边权为 w 的边。

输出格式

输出一行一个整数,代表 1 到 n 的最长路。

若 1 无法到达 n,请输出 −1。

输入输出样例

输入 #1复制

2 1
1 2 1

输出 #1

1

说明/提示

【数据规模与约定】

  • 对于 20%,n≤100n≤100
  • 对于 40%的数据,n≤103n≤103。
  • 对于 100%的数据,1≤n≤1500,0≤m≤5×104,1≤u,v≤n,−105≤w≤105。

解题思路:本题也用到了图论中的拓扑排序,与以往不同本题要求求1 ~ n的路径长度,所以要先将1这个点加入队列,然后从节点1开始不断遍历更新距离。

代码部分:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e5 + 10,INF = -1e9;; 

int n,m;
int h[N],e[N],ne[N],w[N],idx;//邻接表存图 
int q[N],dis[N]; 
int in[N];//in表示入度                           

void add(int a,int b,int c)//建立一条从a指向b的边,权值为c 
{
    e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}

void topsort()//拓扑排序 
{
	int hh = 0,tt = -1;
	
	q[++tt] = 1;
	dis[1] = 0;
	for(int i = 2; i <= n; i++)//将度数为0的点插入队列 
    {
    	dis[i] = INF;
    	if(!in[i]) {//初始化方案数
    		q[++tt] = i;
		} 
	}
	
	while(hh <= tt)
	{
		int t = q[hh++];//取出队头         
		
		for(int i = h[t]; i != -1; i = ne[i])//遍历所有边 
		{
			int j = e[i];//取出能到达的点 
			in[j]--;// 处理与当前节点相关的邻接节点的入度
			dis[j] = max(dis[j],dis[t] + w[i]);
			if(!in[j]) q[++tt] = j;// 如果入度为0,将其加入队列
		}
	}
	
}

int read()
{
    int t = 0, f = 1;
    char ch = getchar();
    while(ch > '9' || ch < '0') {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch <= '9' && ch >= '0') {
        t = t * 10 + ch - '0';
        ch = getchar();
    }
    return t * f;
} 

int main() 
{
    n = read(),m = read();
    
    memset(h, -1, sizeof(h));//一定要初始化 
    
    
    while(m--)
    {
    	int u = read(),v = read(),w = read();
    	in[v]++;
    	add(u,v,w);
	}
	
	topsort();

	if(dis[n] != INF) cout<<dis[n];
	else cout<<-1;
	
    
    return 0;
}

标签:ch,洛谷,idx,int,拓扑,++,P1807,read,dis
From: https://blog.csdn.net/2302_79431881/article/details/145241419

相关文章

  • 洛谷P1246 编码(运用组合数学解决问题)
    传送门:编码-洛谷题目描述编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有 2626 个字母 a,b,c,⋯ ,za,b,c,⋯,z,这些特殊的单词长度不超过 66 且字母按升序排列。把所有这样的单词放在一起,按字典......
  • 洛谷 P11388 [COCI 2024/2025 #1] 飞跃 / Skokovi
    #[COCI2024/2025#1]飞跃/Skokovi##题目背景译自[COCI2024/2025#1](https://hsin.hr/coci/)T2。$\texttt{5s,0.5G}$。满分为$75$。##题目描述有$n$朵花,此外有一个正整数$k$。第$i$朵花的高度为$a_i$。一开始,Filip在第$1$朵花上。当她在第$i$朵花......
  • 计算机网络拓扑结构:构建网络的基石
    计算机网络拓扑结构是构建计算机网络的基础,它决定了网络中各个节点之间的连接方式和数据传输路径。常见的网络拓扑结构有总线型、星型、环型、树型和网状型等。总线型拓扑结构是将所有节点连接在一条总线上,数据沿着总线进行传输。这种结构简单,成本低,但一旦总线出现故障,整个网络就......
  • 【最大生成树】洛谷P2700 逐个击破
    P2700逐个击破#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=2e5+10,M=N;intn,k;LLres,sum;boolst[N];intp[N];structEdge{ inta,b,w; booloperator......
  • 碳化硅MOS驱动要领、PFC/LLC各种拓扑结构应用及材料封装特性
    碳化硅MOS具有宽带隙、高击穿电场强度、高电流密度、快速开关速度、低导通电阻和抗辐射性能等独特特点,在电子器件领域有着广泛的应用。特别是在电力电子、高温电子、光伏逆变器和高频电子等领域,其性能优势能够提高器件的功率密度、效率和稳定性。碳化硅MOS驱动设计-CSDN创作中......
  • 【搜索】洛谷P1123 取数游戏
    P1123取数游戏搜索顺序:按格子枚举。思想类比AcWing843.n-皇后问题按格子枚举方法,以及AcWing1116.马走日AcWing1117.单词接龙AcWing1118.分成互质组,体会恢复现场写在for循环内部与写在for循环外部的区别。最大的区别:恢复现场写在for循环外可以不用清空标记数组。......
  • 【洛谷P1303】高精度乘法
    A*BProblem题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过10^{2000}。入坑OI这么久发现还没有写过......
  • 【洛谷训练记录】【LGR-213-Div.4】洛谷入门赛 #31
    训练情况赛后反思模拟题差点红温,差一道字符串模拟题AKA题问一个数\(a\)加多少后的个位数变成\(b\),取出\(a\)的个位数,再用\(b\)去减,如果小于零答案再加十。#include<bits/stdc++.h>//#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve()......
  • 洛谷P1803
    凌乱的yyy/线段覆盖-洛谷代码区:#include<stdio.h>#include<stdlib.h>structGAME{ intstart; intend;};intcmp(constvoid*a,constvoid*b){ structGAME*game1=(structGAME*)a; structGAME*game2=(structGAME*)b; returngame1->end-game2->......
  • 洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统
    原题链接:https://www.luogu.com.cn/problem/P3168题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的k个任务的优先级之和。解题思路:由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示......