【洛谷 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 @ 2019-10-28 20:49  #Cookies#  阅读(1166)  评论(1编辑  收藏  举报