0分求助QAQ
查看原帖
0分求助QAQ
455490
Sharpsmile楼主2021/12/30 21:09

90°90\degree,爆零了QAQ

代码可能有亿点点丑QAQ

萌新需要大佬的帮助OμOO\mu O

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#define inlind inline void
#define inlinl inline bool
#define inlint inline int
#define inlinc inline char
#define inlins inline string
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,0x80,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define lc(x) sgt[x].ls
#define rc(x) sgt[x].rs
#define int long long
using namespace std;
inlind re(int &x) {
    x=0;
    bool f=0;
    int w=getchar();
    while(w<'0'||w>'9'){if(w=='-')f = 1;w=getchar();}
    while(w<='9'&&w>='0')x=(x<<3)+(x<<1)+w-'0',w=getchar();
    if(f)x=-x;
}
inlind re(int &x1,int &x2) {
    re(x1);
    re(x2);
}
inlind re(int &x1,int &x2,int &x3) {
    re(x1);
    re(x2);
    re(x3);
}
inlind re(int &x1,int &x2,int &x3,int &x4) {
    re(x1);
    re(x2);
    re(x3);
    re(x4);
}
inlind wr(int x) {
    if(x<0)putchar('-'),x=-x;
    if(x>9)wr(x/10);
    putchar(x%10+'0');
}
struct edge{int v,wl,w;bool f;};
vector<edge>g[23000];
vector<int>to[23000];
int s,t,ss,tt;
int d[23000];
inlinl bfs(int s,int t){
    mem_1(d);
    d[s]=0;
    queue<int>q;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        int k=g[u].size();
        for(int i=0,v=g[u][i].v,w=g[u][i].w;i<k;i++)
            if(d[v]==-1&&w)q.push(v),d[v]=d[u]+1;
    }
    return d[t]!=-1;
}
inlint dfs(int id,int si,int t){
    int res=0;
    if(id==t)return si;
    int k=g[id].size();
    for(int i=0;i<k;i++){
        int v=g[id][i].v,w=g[id][i].w;
        if(w&&d[v]==d[id]+1){
            int tmp=dfs(v,min(si,w),t);
            g[id][i].w-=tmp;
            si-=tmp;
            res+=tmp;
            g[v][to[id][i]].w+=tmp;
            if(si==0) break;
        }
    }
    if(res==0)d[id]=-1;
    return res;
}
int n,m;
const int inf=99999999999999ll;
inlint dinic(int s,int t){
    int res=0;
    while(bfs(s,t)){
        res+=dfs(s,99999999999999ll,t);}
    return res;
}
inlind ins(int u,int v,int wl,int w){
    pb(to[u],g[v].size());
    pb(to[v],g[u].size());
    g[u].push_back({v,wl,w,0});
    g[v].push_back({u,0,0,1});
}
int M[10003];
signed main(){
    while(cin>>n>>m){
        if(n==0||m==0) return 0;
        int cnt =n+m;
        s=0;
        t=++cnt;
        for(int i=1,gt;i<=m;i++)cin>>gt,ins(n+i,t,inf,gt);
        for(int i=1;i<=n;i++){
            int c,d;
            cin>>c>>d;
            ins(s,i,0,d);
            for(int j=1;j<=c;j++){
                int p,l,r;
                cin>>p>>l>>r;
                p++;
                ins(i,n+p,l,r);
            }
        }
        ins(t,s,0,inf);
        ss=++cnt;
        tt=++cnt;
        for(int i=1;i<=cnt-2;i++){
            int k=g[i].size();
            for(int j=0;j<k;j++){
                M[i]-=g[i][j].wl;
                M[g[i][j].v]-=g[i][j].wl;
            }
        }
        int sum=0;
        for(int i=1;i<=cnt-2;i++){
            if(M[i]<0)
                ins(i,tt,0,-M[i]);
            if(M[i]>0)ins(ss,i,0,M[i]),sum+=M[i];
        }
        int ans=dinic(ss,tt);
        if(ans!=sum){
            cout<<-1<<endl<<endl;
            for(int i=1;i<=cnt;i++)g[i].clear(),to[i].clear();
            continue;    }
        ans=inf-g[t][g[t].size()-1].w;
        for(int i=1;i<=cnt-2;i++){
            int k=g[i].size();
            for(int j=0;j<k;j++){
                g[i][j].w-=ans;
            }
        }
        cout<<dinic(s,t)<<endl<<endl;
        for(int i=1;i<=cnt;i++)g[i].clear(),to[i].clear();
    }
        return 0;
}

2021/12/30 21:09
加载中...