求救,TLE 10pts
查看原帖
求救,TLE 10pts
1072440
Matrix_J楼主2025/8/31 14:18
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const int MAXN = 500 + 10;
const ll inf = 1e12;

int n,m;
vector <tuple <int,ll,int> > G[MAXN];
int vis[MAXN],cnt[MAXN],pre[MAXN],lst[MAXN];
ll dis[MAXN];

int dfs(int h) {
    int u=h,sum=0;
    memset(vis,0,sizeof vis);
    do { u=pre[u],vis[u]=1;} while(!vis[u]);
    h=u;
    do { sum+=lst[u],u=pre[u];} while(u!=h);
    if(sum==0) cout<<-1<<'\n',exit(0);
    return (sum>0 ? 1 : -1);
}

int spfa(ll C) {
    int s=n+1;
    for(int i=1;i<=n+1;i++) 
        dis[i]=inf,vis[i]=0,cnt[i]=0,pre[i]=0;

    queue <int> Q;
    Q.push(s);
    dis[s]=0,vis[s]=1,cnt[s]++;

    while(!Q.empty()) {
        int u=Q.front();
        Q.pop();
        vis[u]=0;
        for(auto [v,val,k] : G[u]) 
            if(dis[v]>dis[u]+val+(ll)k*C) {
                dis[v]=dis[u]+val+(ll)k*C;
                pre[v]=u,lst[v]=k;
                if(!vis[v]) {
                    vis[v]=1;
                    Q.push(v);
                    cnt[v]++;
                    if(cnt[v]>n+1)
                        return dfs(v);
                }
            }
    }
    return 0;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        int op,s,t;
        ll l; 
        cin>>op>>s>>t>>l;
        if(op==1) {
            if(s<t) G[t].push_back({s,-l,0});
            else G[t].push_back({s,-l,1});
        }
        else if(op==2) {
            if(s<t) G[s].push_back({t,l,0});
            else G[s].push_back({t,l,-1});
        }
    }

    for(int i=1;i<=n-1;i++)
        G[i+1].push_back({i,-1,0});
    G[1].push_back({n,-1,1});

    for(int i=1;i<=n;i++) 
        G[n+1].push_back({i,0,0});
    
    ll ansl,ansr;
    ll l=0,r=inf;
    while(l<r) {
        ll mid=(l+r)>>1;
        int tp=spfa(mid);
        if(!tp) l=mid;
        else if(tp==1) l=mid+1;
        else if(tp==-1) r=mid-1;
    }
    ansr=l;

    if(ansr>=inf) {
        cout<<-1<<'\n';
        return 0;
    }
    
    l=0,r=inf;
    while(l<r) {
        ll mid=(l+r)>>1;
        int tp=spfa(mid);
        if(!tp) r=mid;
        else if(tp==1) l=mid+1;
        else if(tp==-1) r=mid-1;
    }
    ansl=l;

    cout<<ansr-ansl+1<<'\n';

    return 0;
}
2025/8/31 14:18
加载中...