88pts WA求调
查看原帖
88pts WA求调
913522
luobo215楼主2023/11/12 11:24
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using db = double;
using ldb = long double;
using pii = pair<int, int>;
#define CI const int
#define mp make_pair
CI maxn=2e5+5;
struct node{
    int u,to,val,p;
}e[maxn];
int cnt;
int in[maxn],out[maxn];
void add(int u,int v,int w,int p)
{
    e[++cnt].to=v;
    e[cnt].val=w;
    e[cnt].p=p;
    e[cnt].u=u;
}
int n,m,u,v,w,z;
vector<int> G[maxn];
CI inf=0x3f3f3f3f;
int ans[maxn];
bool cmp(node a,node b){return a.val>b.val;}
queue<int> q;
bool vis[maxn];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>w>>z;
        add(u,v,w,z);
        in[v]++,out[u]++;
    }
    memset(ans,0x3f,sizeof(ans));
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int v=e[i].to;
        G[v].push_back(i);
    }
    for(int i=1;i<=n;i++)if(!out[i])q.push(i);
    for(int i=1;i<=m;i++)
    {
        int u=e[i].u,r=e[i].val;
        if(vis[i])continue;
        vis[i]=1;
        ans[u]=min(ans[u],r);
        out[u]--;
        if(!out[u])q.push(u);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(auto ed:G[u])
            {   
                if(vis[ed])continue;vis[ed]=1;
                int ft=e[ed].u,fp=e[ed].p,fr=e[ed].val;
               // cout<<ft<<' '<<fr<<' '<<fp<<' '<<ans[u]<<'\n';
               if(ans[u]!=inf)
                ans[ft]=min(ans[ft],max(fr,ans[u]-fp));
                //cout<<ft<<' '<<ans[ft]<<'\n';
                out[ft]--;
                if(!out[ft])q.push(ft);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(ans[i]==inf)cout<<"-1"<<' ';
        else cout<<ans[i]<<' ';
    }
    return 0;
}

自认为写的比较清晰(

2023/11/12 11:24
加载中...