求条
查看原帖
求条
1165197
Eastern_Leaf楼主2025/1/28 18:22
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p;
struct edge{
    int v,w;
    edge(int a,int b){
        v = a,w = b;
    }
};
vector<edge> e[2505],k[2505];
void build(int u,int v,int w){
    e[u].emplace_back(edge(v,w));
    k[v].emplace_back(edge(u,w));
    return ;
}
int dis[2505],cnt[2505];
bool vis[2505],f[2505];
void dfs(int x){
    f[x] = 1;
    for(int i = 0;i<k[x].size();i++){
        if(f[k[x][i].v])  continue;
        dfs(f[k[x][i].v]);
    }
    return ;
}
bool spfa(int s){
    memset(dis,0xcf,sizeof(dis));
    memset(cnt,0,sizeof(cnt));
    memset(vis,0,sizeof(vis));
    dis[s] = 0;
    vis[s] = 1;
    cnt[s] = 0;
    queue<int> q;
    q.push(s);
    int frt;
    while(!q.empty()){
        frt = q.front();
        q.pop();
        vis[frt] = 0;
        for(int i = 0;i<e[frt].size();i++){
            if((dis[e[frt][i].v] < dis[frt]+e[frt][i].w)&&f[e[frt][i].v]){
                dis[e[frt][i].v] = dis[frt]+e[frt][i].w;
                cnt[e[frt][i].v] = cnt[frt]+1;
                if(!vis[e[frt][i].v]){
                    
                    vis[e[frt][i].v] = 1;
                    q.push(e[frt][i].v);
                }
                if(cnt[e[frt][i].v] >= n){
                    return 0;
                }
            }
        }
    }
    return 1;
}
signed main(){
    cin>>n>>m>>p;
    int U,V,W;
    for(int i = 1;i<=m;i++){
        cin>>U>>V>>W;
        build(U,V,W-p);
    }
    dfs(n);
    if(spfa(1)){
        if(dis[n] > 0){
            cout<<dis[n];
        }else{
            cout<<0;
        }
    }else{
        cout<<-1;
    }
    return 0;
}
2025/1/28 18:22
加载中...