1. 程式人生 > >洛谷P1807 最長路_NOI導刊2010提高(07) 最長路

洛谷P1807 最長路_NOI導刊2010提高(07) 最長路

pro ace prior show str back con 去掉 esp

傳送門

把邊的權值改為負的,然後跑一遍最短路,對得到的結果取負就行了。忽然意識到邊的權值變為負的之後就不能用dijkstra了,因該用spfa,不過把dijkstra裏判斷是否進入過堆的語句去掉也a了。

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m;
vector<pair<int,int> >g[1505];
priority_queue<pair<int,int> >q;
int book[1505
]; int dis[1505]; const int inf=99999999; void dijkstra() { int i; for(i=1;i<=n;i++)dis[i]=inf; dis[1]=0; q.push(make_pair(0,1)); while(q.size()) { int x=q.top().second;q.pop(); // if(book[x]==1)continue; // book[x]=1; for(i=0;i<g[x].size();i++) {
int y=g[x][i].second; int yy=g[x][i].first; if(dis[y]>dis[x]+yy) { dis[y]=dis[x]+yy; q.push(make_pair(-dis[y],y)); } } } } void solve() { cin>>n>>m; for(int i=1;i<=m;i++) {
int a,b,c; cin>>a>>b>>c; g[a].push_back(make_pair(-c,b));//第二位是頂點編號 } dijkstra(); if(dis[n]==inf)cout<<"-1\n"; else cout<<-dis[n]<<endl; } int main() { solve(); }

洛谷P1807 最長路_NOI導刊2010提高(07) 最長路