【洛谷 2807】最长路

题目描述

设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

 

题解:woc最长路原来就这么简单!!!!!为什么我考场想不到呢!!!

复制代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
typedef long long ll;
using namespace std;
const int oo=21474836;
int n,m,k,cnt,x,y,z,s,t,dis[1550],vis[1550];
struct node{
    int to;
    int val;
    int next;
}e[50005];
int head[1550];
void add(int a,int b,int c){
    e[++cnt].to=b; e[cnt].val=c;
    e[cnt].next=head[a]; head[a]=cnt;
}
queue<int>q;
int main(){
    freopen("1807.in","r",stdin);
    freopen("1807.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&x,&y,&z);
        add(x,y,z);
    }
    for(int i=1;i<=n;i++)
        dis[i]=0;
    q.push(1);
    dis[1]=0;
    vis[1]=1;
    while(!q.empty()){
        x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=head[x];i!=0;i=e[i].next){
            int too=e[i].to;
            if(dis[too]<dis[x]+e[i].val)
            { 
               dis[too]=dis[x]+e[i].val;
                if(vis[too]==0){
                    vis[too]=1; q.push(too);
                }
            } 
        }
    }
    if(dis[n]==0) cout<<-1;
    else cout<<dis[n]<<endl;
    return 0;
}
复制代码

 

posted @   #Cookies#  阅读(1169)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示