zoukankan      html  css  js  c++  java
  • bzoj1532 [POI2005]Kos-Dicing

    Description

    Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的家伙,他想成为那个玩的最好的人,他现在知道了所有比赛的安排,他想知道,在最好的情况下,他最少只需要赢几场就可以赢得冠军,即他想知道比赛以后赢的最多的那个家伙最少会赢多少场.

    Input

    第一行两个整数n 和 m, 1 <= n <= 10 000, 0 <= m <= 10 000; n 表示一共有多少个参赛者, m 表示有多少场比赛. 选手从1 到 n编号. 接下来m 行每行两个整数表示该场比赛的两个选手,两个选手可能比赛多场.

    Output

    第一行表示赢得最多的人最少会赢多少场

    Sample Input

    4 4
    1 2
    1 3
    1 4
    1 2

    Sample Output

    1

    网络流二分+判定

    枚举mid,S向每个人连mid的边,每个人向有关比赛连1的边,比赛向T连1的边,ans==m时可行

    我把dinic用的ans和二分的ans搞混了……然后一直wa啊wa啊wa到我火了直接输出l……

    #include<cstdio>
    #include<cstring>
    #define MX 10010
    #define S 0
    #define inf 0x7fffffff
    struct comp{
    	int x,y;
    }c[2*MX];
    struct edge{
    	int to,next,v;
    }e[8*MX];
    int n,m,ans,cnt,T;
    int head[2*MX];
    int h[2*MX];
    int q[2*MX];
    inline int min(int a,int b)
    {return a<b?a:b;}
    inline void ins(int u,int v,int w)
    {
    	e[++cnt].to=v;
    	e[cnt].v=w;
    	e[cnt].next=head[u];
    	head[u]=cnt;
    }
    inline void insert(int u,int v,int w)
    {
    	ins(u,v,w);
    	ins(v,u,0);
    }
    inline bool bfs()
    {
        memset(h,-1,sizeof(h));
        int t=0,w=1;
        q[1]=S;h[S]=0;
        while (t<w)
        {
            int now=q[++t];
            for (int i=head[now];i;i=e[i].next)
              if(h[e[i].to]==-1&&e[i].v)
              {
                q[++w]=e[i].to;
                h[e[i].to]=h[now]+1;
              }
        }
        if (h[T]==-1) return 0;
        return 1;
    }
    inline int dfs(int x,int f)
    {
        if (x==T||!f) return f;
        int used=0,w;
        for (int i=head[x];i;i=e[i].next)
          if (e[i].v&&h[e[i].to]==h[x]+1)
          {
            w=f-used;
            w=dfs(e[i].to,min(e[i].v,w));
            used+=w;
            e[i].v-=w;
            e[i^1].v+=w;
          }
        if (!used) h[x]=-1;
        return used;
    }
    inline void dinic(){ans=0;while (bfs())ans+=dfs(S,inf);}
    inline bool jud(int x)
    {
    	cnt=1;
    	memset(head,0,sizeof(head));
    	memset(e,0,sizeof(e));
        for(int i=1;i<=n;i++)
            insert(S,i,x);
        for(int i=1;i<=m;i++)
        {
            insert(i+n,T,1);
            insert(c[i].x,i+n,1);
            insert(c[i].y,i+n,1);
        }
    	dinic();
    	return ans==m;
    }
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int main()
    {
    	n=read();m=read();T=n+m+1;
    	for (int i=1;i<=m;i++)
    	{c[i].x=read();c[i].y=read();}
    	int l=0,r=m;
    	while (l<=r)
    	{
    		int mid=(l+r)>>1;
    		if (jud(mid))r=mid-1;
    		else l=mid+1;
    	}
    	printf("%d",l);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    JSP 静态文件路径配置
    java 类拷贝
    spring security demo
    NYOJ-1057-寻找最大数(三)
    nyoj-1036-非洲小孩
    POJ-3617-Best Cow Line
    NYOJ-891-找点
    大平神出的一道双向链表题
    ZOJ-1360 || POJ-1328——Radar Installation
    POJ-2386-Lake Counting
  • 原文地址:https://www.cnblogs.com/zhber/p/4035924.html
Copyright © 2011-2022 走看看