求调 30pts 差分约束
查看原帖
求调 30pts 差分约束
1072440
Matrix_J楼主2025/8/30 10:36
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 4e3+10;
const int inf=0x3f3f3f3f;

int n,m;
vector <int> E1[MAXN],E2[MAXN];
vector <pair <int,int> > G[MAXN],E;
int dis[MAXN],vis[MAXN],cnt[MAXN];

void bfs(int s,vector <int> E[],bool F[]) {
    queue <int> Q;
    Q.push(s);
    F[s]=true;

    while(!Q.empty()) {
        int u=Q.front();
        Q.pop();
        for(int v : E[u]) 
            if(!F[v]) {
                F[v]=true;
                Q.push(v);
            }
    }
}

bool A[MAXN],B[MAXN];

bool spfa(int s) {
    for(int i=1;i<=n;i++) 
        dis[i]=inf,vis[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] : G[u]) 
            if(dis[v]>dis[u]+val) {
                dis[v]=dis[u]+val;
                if(!vis[v]) {
                    vis[v]=1;
                    Q.push(v);
                    cnt[v]++;
                    if(cnt[v]>n+1) return false;
                }
            }
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        int u,v;
        cin>>u>>v;
        E.push_back({u,v});
        E1[u].push_back(v);
        E2[v].push_back(u);
    }

    bfs(1,E1,A);
    bfs(n,E2,B);

    if(!A[n]) {
        cout<<-1<<'\n';
        return 0;
    }
    
    for(auto [u,v] : E) {
        if(A[u] && B[v]) 
            G[u].push_back({v,9});
            G[v].push_back({u,-1});
    }
    
    if(!spfa(1)) cout<<-1<<'\n';
    else {
        cout<<n<<" "<<m<<'\n';
        for(auto [u,v] : E) {
            cout<<u<<" "<<v<<" ";
            if(A[u] && B[v]) cout<<dis[v]-dis[u]<<'\n';
            else cout<<1<<'\n';
        }
    }
    
    return 0;
}
2025/8/30 10:36
加载中...