【洛谷 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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM