h4183最大流

来源:互联网 发布:java光标变粗 编辑:程序博客网 时间:2024/05/16 22:11

这道最大流很巧妙,将每一个点只能过一次写成流通量为1,这样流过一次就不可以再过了,最后判断最大流是否大于2 就行了,蛮简单的


#include <iostream>
#include<stdio.h>
#include<string.h>
#include<queue>


using namespace std;
struct node
{
    double p;
    int x,y,r;
}s[400];
int flow[400][400],pre[400],a[400];
int n,sum;


void Bflow(int st,int ed)
{
    while(1)
    {
        memset(pre,-1,sizeof(pre));
        memset(a,0,sizeof(a));
        a[st]=10005;
        queue<int> q;
        q.push(st);
        while(!q.empty())
        {
            int index=q.front();
            q.pop();
            if(index==ed)
                break;
            for(int i=1;i<=n;i++)
            {
                if(a[i]==0&&flow[index][i]>0)
                {
                    a[i]=min(a[index],flow[index][i]);
                    pre[i]=index;
                    q.push(i);
                }
            }
        }
        if(a[ed]==0)
            break;
        sum=sum+a[ed];
        int i=ed;
        int index=pre[i];
        while(1)
        {
            flow[index][i]-=a[ed];
            flow[i][index]+=a[ed];
            if(index==st)
                break;
            i=index;
            index=pre[i];
        }
    }
}
int main()
{
    int k;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d",&n);
        sum=0;
        memset(flow,0,sizeof(flow));
        double minn=800,maxn=200;
        int mx,my;
        for(int i=1;i<=n;i++)
        {
            scanf("%lf %d %d %d",&s[i].p,&s[i].x,&s[i].y,&s[i].r);
            if(maxn<s[i].p)
            {
                maxn=s[i].p;
                mx=i;
            }
            if(minn>s[i].p)
            {
                minn=s[i].p;
                my=i;
            }
            for(int j=1;j<i;j++)
            {
                if((s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y)<=(s[i].r+s[j].r)*(s[i].r+s[j].r))
                {
                    if(s[i].p<s[j].p)
                        flow[i][j]=1;
                    else
                        flow[j][i]=1;
                }
            }
        }


        Bflow(my,mx);
        if(sum>=2)
            printf("Game is VALID\n");
        else
            printf("Game is NOT VALID\n");
    }
    return 0;
}
/*
2
4
400.0 0 0 4
789.0 7 0 2
500.35 5 0 2
500.32 5 0 3
*/

0 0
原创粉丝点击