• p2071 座位安排


    传送门

    题目

    已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。

    输入格式:

    第一行,一个正整数N。

    第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。

    输出格式:

    一个非负整数,为最多使得多少人满意。

    N<=2000。

    分析

    以为每排有2个座位,所以在右边建2*n个点代表座位与左边2*n个点所代表的人进行匹配。将每一个人与他所满意的两排共四个座位连边,在这里,第x排的2个座位分别为x和x+n

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int wh[5000],used[5000],t,n,ans;
    vector<int>v[4001];
    bool work(int x){
          int i,j,k;
          for(i=0;i<v[x].size();i++)
            if(used[v[x][i]]!=t){
              used[v[x][i]]=t;
              if(!wh[v[x][i]]||work(wh[v[x][i]])){
                   wh[v[x][i]]=x;
                   return 1;
                   }
            }
          return 0;
    }
    void go(){
          int i,j,k;
          for(i=1;i<=2*n;i++){
               t=i;
             if(work(i))ans++;
          }
    }
    int main()
    {     int m,i,j,k,x,y;
          cin>>n;
          for(i=1;i<=2*n;i++){
              cin>>x>>y;
              v[i].push_back(x);
              v[i].push_back(x+n);
              v[i].push_back(y);
              v[i].push_back(y+n);
          }
          go();
          cout<<ans<<endl;
          return 0;
    }

  • 相关阅读:
    【原创】cs+html+js+css模式(一):初识新模式
    【原创】cs+html+js+css模式(三):RemoteCallHandler详解
    删除表数据
    【原创】cs+html+js+css模式(二):webconfig中的设置
    silverlight动画
    rdlc报表表达式应用(字符串和转换)
    Accordion控件制作下拉面板菜单(静态数据)
    silverlight三种布局
    Sys.UI.DomElement
    Accordion控件动态数据绑定案例
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9026810.html
Copyright © 2020-2023  润新知