2 条题解

  • 1
    @ 2022-8-22 21:59:52

    最大流 DinicDinic 算法:

    #include<bits/stdc++.h>
    using namespace std;
    const int inf=1<<30;
    int dep[10101],head[10101],inque[10101];
    int top=1;
    int maxflow=0,ans=0;
    int n,m,s,t,x;
    inline int read()
    {
        int x=0;char c=getchar();
        while(c>'9'||c<'0')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    struct Node
    {
        int v;
        int val;
        int next;
    }node[200100];
    inline void addedge(int u,int v,int val)
    {
        node[++top].v=v;
        node[top].val=val;
        node[top].next=head[u];
        head[u]=top;
    }
    bool bfs()
    {
        memset(dep,0x3f,sizeof(dep));
        memset(inque,0,sizeof(inque));
        dep[s]=0;
        queue<int>q;
        q.push(s);
        while(!q.empty())
    	{
            int u=q.front();
            q.pop();
            inque[u]=0; 
            for(int i=head[u];i;i=node[i].next)
    		{
                int d=node[i].v;
                if(dep[d]>dep[u]+1&&node[i].val)
    			{
                    dep[d]=dep[u]+1;
                    if(inque[d]==0)
    				{
                        q.push(d);
                        inque[d]=1;
                    }
                }
            }
        }
        if(dep[t]!=0x3f3f3f3f)
    	{
    		return 1;
    	}
        return 0;
    }
    inline int min(int x,int y)
    {
        return x<y?x:y;
    }
    int dfs(int u,int flow)
    {
        int rlow=0;
        if(u==t)
    	{
    		return flow;
    	}
        for(int i=head[u];i;i=node[i].next)
    	{
            int d=node[i].v;
            if(node[i].val and dep[d]==dep[u]+1)
    		{
                if(rlow=dfs(d,min(flow,node[i].val)))
    		    {
                    node[i].val-=rlow;
                    node[i^1].val+=rlow;
                    return rlow;
                }   
            }
        }
        return 0;
    }
    int dinic()
    {
        int lowflow;
        while(bfs())
    	{
            while(lowflow=dfs(s,inf))
    		{
    			maxflow+=lowflow;
    		}
        }
        return maxflow;
    }
    int main()
    {
        n=read();
    	m=read();
    	x=read();
    	s=1,t=n;
        for(int i=1;i<=m;i++)
    	{
    		int u,v,val;
    		u=read(),v=read(),val=read(),addedge(u,v,val),addedge(v,u,0);
    	}
        ans=dinic();
        if(ans) 
    	{
    		printf("%d %d\n",ans,(x-1)/ans+1);
    	}
    	else 
    	{
    		printf("Orz Ni Jinan Saint Cow!\n"); 
    	}
        return 0;
    }
    
    • 1
      @ 2022-7-14 19:39:46
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2009;
      struct edge{int to,nxt,w;}e[N*2];int hd[N],tot=1;
      void add(int u,int v,int w){
      	e[++tot]=(edge){v,hd[u],w}; hd[u]=tot;
      }
      
      int n,m,d[N],ans,x;
      bool bfs(){
      	queue<int>q; memset(d,0,sizeof(d));
      	q.push(1),d[1]=1;
      	while(!q.empty()){
      		int u=q.front(); q.pop();
      		for(int i=hd[u],v;i;i=e[i].nxt)
      			if(!d[v=e[i].to]&&e[i].w){
      				q.push(v),d[v]=d[u]+1;
      				if(v==n) return 1;
      			}
      	}
      	return 0;
      } 
      int dfs(int u,int flow){
      	if(u==n) return flow;
      	int rest=flow;
      	for(int i=hd[u],v;i&&rest;i=e[i].nxt){
      		if(e[i].w&&d[v=e[i].to]==d[u]+1){
      			int tmp=dfs(v,min(rest,e[i].w));
      			if(!tmp) d[v]=0;
      			rest-=tmp; e[i].w-=tmp; e[i^1].w+=tmp;
      		}
      	}
      	return flow-rest; //真正给出去的 
      }
      
      int main(){
      	scanf("%d%d%d",&n,&m,&x);
      	for(int i=1,u,v,w;i<=m;i++)
      		scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,0);
      	int tmp=0;
      	while(bfs()) while(tmp=dfs(1,1e9)) ans+=tmp;
      	if(!ans){puts("Orz Ni Jinan Saint Cow!");return 0;} 
      	printf("%d ",ans);
      	int a2=ceil(x*1./ans);
      	printf("%d",a2);
      	return 0;
      }
      
      • 1

      信息

      ID
      344
      时间
      1000ms
      内存
      125MiB
      难度
      5
      标签
      递交数
      6
      已通过
      4
      上传者