最长路
题目链接:https://www.luogu.com.cn/problem/P1807
题意:
求1~n之间的最长路
思路:
将所有边权变为负边权,跑spfa最短路可得-最长距离
int n,m;
struct edge{
int v,w;
};
vector<edge>e[maxn];
int d[maxn],cnt[maxn],vis[maxn];
void spfa(int s){
queue<int>q;
rep(i,1,n)d[i]=llmax;
d[s]=0;
vis[s]=1;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(auto ed:e[u]){
int v=ed.v,w=ed.w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
cnt[v]=cnt[u]+1;
// if(cnt[v]>=n)return true;
if(!vis[v]){
q.push(v);vis[v]=1;
}
}
}
}
}
void solve(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
e[u].pb({v,-w});
}
int s=1;
spfa(s);
if(d[n]==llmax){
cout<<-1<<endl;return;
}
cout<<-d[n]<<endl;
}

浙公网安备 33010602011771号