題目描述
設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; }