wa求助,码风良好 玄衣冠
查看原帖
wa求助,码风良好 玄衣冠
760859
Let_Fly楼主2023/8/16 16:25
#include<bits/stdc++.h>
using namespace std;
#define tm SBZYMXXS
#define int long long
#define inf 0x3f3f3f3f

const int N=1e6+5;

int n,m,k,s,t;
int f[100],wei[100],tm[100];
vector<int> sp[100];//run time clock
//
int cnt=1,h[N],d[N],now[N];
struct Edge{
    int v,w,nxt;
}e[N];
void add(int u,int v,int w){e[++cnt] = (Edge) { v, w, h[u] }; h[u] = cnt;}
void addd(int u,int v,int w){add(u,v,w);add(v,u,0);}
//
bool v[N];
int maxflow,ret;

int find(int x){
    if(x!=f[x])f[x]=find(f[x]);
    return f[x];
}
void uni(int x,int y){
    int k=find(x),l=find(y);
    if(k!=l) f[k]=l;
}

bool bfs(){
    memset(d,0,sizeof d);
    d[s]=1;
    queue<int> q;
    q.push(s);
    now[s]=h[s];
    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(int i=h[x],y;i;i=e[i].nxt){
            if(e[i].w&&!d[y=e[i].v]){
                now[y]=h[y];
                d[y]=d[x]+1;
                q.push(y);
                if(y==t)return 1;
            }
        }
    }
    return 0;
}

int dinic(int x,int flow){
    if(x==t)return flow;
    int ret=flow;
    for(int i=now[x],y;i&&ret;i=e[i].nxt){
        now[x]=i;
        if(e[i].w&&d[y=e[i].v]==d[x]+1){
            int t=dinic(y,min(e[i].w,ret));
            if(!t)d[y]=0;
            ret-=t;
            e[i].w-=t;
            e[i^1].w+=t;
        }
    }
    return flow-ret;
}

int Dinic(){
    maxflow=ret=0;
    while(bfs())while(ret=dinic(s,inf))maxflow+=ret;
    return maxflow;
}

signed main(){
    cin>>n>>m>>k;
    s=0,t=10000;
    int rs=0;
    for(int i=1;i<=m;i++){
        cin>>wei[i]>>tm[i];
        for(int j=0;j<tm[i];j++){
            int v;
            cin>>v;
            if(v==0)v=n+1;
            if(v==-1)v=n+2;
            sp[i].push_back(v);
            if(j>0) uni(sp[i][j-1],sp[i][j]);
        }
    }
    if(find(n+1)!=find(n+2)) {puts("0");return 0;}
    for(int ans=1;;ans++){
        addd(s,ans*(n+1),inf);//the earth on x day
        addd(ans*(n+2),t,inf);
        for(int i=1;i<=m;i++){
            int x=(ans-1)%tm[i],y=ans%tm[i];//x=last day pos,y=now day pos
            if(sp[i][x]==n+2) x=t;
            else x=(ans-1)*(n+1)+sp[i][x];//give an id
            if(sp[i][y]==n+2) y=t;
            else y=ans*(n+1)+sp[i][y];
            addd(x,y,wei[i]);//last day to now day
            rs+=Dinic();
            if(rs>=k){
                cout<<ans;
                return 0;
            }
            for(int i=1;i<=n+1;++i) add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);//down
        }
    }
    return 0;
}
2023/8/16 16:25
加载中...