poj 1966

来源:互联网 发布:我的世界掉落优化mod 编辑:程序博客网 时间:2024/04/30 23:13

题目链接http://poj.org/problem?id=1966

题目分析 关于连通度的问题 求至少删掉多少点 使这个图不连通  百度manger定理 建图 最大流。。

#include<stdio.h>#include<string.h>#include<algorithm>#include<cmath>#include<queue>#include<string>#include<iostream>#define N 110#define CC(x,y) memset(x,y,sizeof(x))#define inf 0x7fffff#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using namespace std;struct node{    int y,ne,f;}e[N*N];int dis[N],pre[N],cur[N],h[N],gap[N],s,t,nn,i,j,k,m,n,x,y,z,l;void add(int x,int y,int f){    e[k].y=y;e[k].f=f;e[k].ne=h[x];h[x]=k++;    e[k].y=x;e[k].f=0;e[k].ne=h[y];h[y]=k++;}int sap(int s,int t,int nn){    for (i=0;i<=nn;i++)    {        cur[i]=h[i];        gap[i]=dis[i]=0;    }    int u,v;    int flow=0,aug=inf;    gap[s]=nn;    u=pre[s]=s;    bool flag;    while(dis[s]<nn)    {        flag=0;        for(int &j=cur[u]; j!=-1; j=e[j].ne)        {            int v=e[j].y;            if(e[j].f>0&&dis[u]==dis[v]+1)            {                flag=1;                if(e[j].f<aug) aug=e[j].f;                pre[v]=u;                u=v;//printf("%d\n",aug);                if(u==t)                {                    flow+=aug;                    while(u!=s)                    {                        u=pre[u];                        e[cur[u]].f-=aug;                        e[cur[u]^1].f+=aug;                    }                    aug=inf;                }                break;            }        }        if(flag)            continue;        int mindis=nn;        for(int j=h[u]; j!=-1; j=e[j].ne)        {            int v=e[j].y;            if(e[j].f>0&&dis[v]<mindis)            {                mindis=dis[v];                cur[u]=j;            }        }        if((--gap[dis[u]])==0)            break;        gap[dis[u]=mindis+1]++;        u=pre[u];    }    //printf("%d\n",flow);    return flow;}void init(){    for (int i=0;i<k;i+=2)        e[i].f+=e[i^1].f,e[i^1].f=0;}int main(){    #ifndef ONLINE_JUDGE     freopen("in.txt","r",stdin);    #endif // ONLINE_JUDGE    while (scanf("%d%d",&n,&m)!=EOF)    {        CC(h,-1);        k=0;        for (i=0;i<n;i++)            add(i,i+n,1);        for (i=0;i<m;i++)        {            scanf(" (%d,%d)",&x,&y);            add(x+n,y,inf);            add(y+n,x,inf);        }        int ans=inf;        for (int i=0;i<n;i++)            for (int j=0;j<n;j++)                if (i!=j) {ans=min(ans,sap(i+n,j,2*n)),init();}        if (ans>=inf)printf("%d\n",n);else printf("%d\n",ans);    }    return 0;}


原创粉丝点击