zoukankan      html  css  js  c++  java
  • 1721. Two Sides of the Same Coin 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1721

    左边:rank   3,4,7,8,11,12.........

    右边:rank   5,6,9,10,13,14.........

    然后匈牙利算法

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    #include<set>
    #include<map>
    #include<string>
    #include<queue>
    #include<stack>
    #include <iomanip>
    using namespace std;
    #define LL long long
    const int INF=0x3f3f3f3f;
    const int N=1006;
    bool visited[N];
    string name[N];
    string type[N];
    int r[N];
    int f[N];
    int head[N],I;
    struct node
    {
        int j,next;
    }side[N*N];
    void add(int i,int j)
    {//cout<<i<<" "<<j<<endl;
        side[I].j=j;
        side[I].next=head[i];
        head[i]=I++;
    }
    bool dfs(int x)
    {
        for(int t=head[x];t!=-1;t=side[t].next)
        {
            int j=side[t].j;
            if(!visited[j])
            {
                visited[j]=true;
                if(f[j]==-1||dfs(f[j]))
                {
                    f[j]=x;
                    return true;
                }
            }
        }
        return false;
    }
    inline bool L(int i)
    {
        if((r[i]-3)%4==0||(r[i]-4)%4==0)
        return true;
        return false;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n;
        while(cin>>n)
        {
            memset(head,-1,sizeof(head));
            I=0;
            for(int i=0;i<n;++i)
            {
                cin>>name[i]>>type[i]>>r[i];
                for(int j=0;j<i;++j)
                {
                    if(abs(r[i]-r[j])==2&&(type[i]!=type[j]||type[i]=="anything"))
                    {
                        if(L(i)&&!L(j))
                        add(i,j);
                        if(L(j)&&!L(i))
                        add(j,i);
                    }
                }
            }
            int ans=0;
            memset(f,-1,sizeof(f));
            for(int i=0;i<n;++i)
            {
                if(L(i))
                {
                    memset(visited,false,sizeof(visited));
                    if(dfs(i))
                    ++ans;
                }
            }
            cout<<ans<<endl;
            for(int i=0;i<n;++i)
            {
                if(f[i]!=-1)
                {
                    if(type[i]=="statements"||type[f[i]]=="testdata")
                    cout<<name[i]<<" "<<name[f[i]]<<endl;
                    else
                    cout<<name[f[i]]<<" "<<name[i]<<endl;
                }
            }
    
        }
        return 0;
    }
    
  • 相关阅读:
    35-高级特性之iterable与iterator
    33-高级特性之generator(1)
    34-高级特性之generator(2)
    32-高级特性之类装饰器
    什么是Autolayout
    屏幕适配
    NSTimer
    分页
    UIScrollView的缩放原理
    设置图片圆角
  • 原文地址:https://www.cnblogs.com/liulangye/p/2783283.html
Copyright © 2011-2022 走看看