把边的权值改为负的,然后跑一遍最短路,对得到的结果取负就行了。忽然意识到边的权值变为负的之后就不能用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(); }