codeforces 1027f F. Session in BSU

链接: http://codeforces.com/contest/1027/problem/F

题意:小明有n场考试,每场考试可以在a或者b天考,但是小明每天只能做一套考试卷子,问你小明能否考完所有的考试如果可以输出最大的考试日,如果不可以,输出-1

思路: 看问题其实是一个最优匹配的问题,如果我们我们把点分为两类,左边的点为考试,右边的点为某天。那么我们要做的就是找到左边点全部匹配并且右边的点最小的点。 注意到这里的每一场考试只有两个考试日,也就是只有两个天数点与他相连,那么我可以把这个考试点缩掉,缩成边,那么就可以转化为为每个边匹配一个与他相邻的点,使得最大的点最小。

这里图就分成了几个联通块,那么对于每个联通块,如果他的节点数等于边数,那么肯定都要选。如果节点数等于边数+1,那么我只需要加次小的节点。 如果边数> 点数,肯定是无解呀。

代码:

#include

using namespace std;
typedef long long ll;
typedef pair pii;
const int N =2e6+5;

int f[N];
int num[N];
pii a[N];
int tot;
int vis[N];
int vise[N];
int totn,totm;
int mx,ci;
int n;
vector ve[N];

void init()
{
    tot=0;
    for(int i=0;it2) swap(t1,t2);
    if(t1!=t2){
        f[t2]=t1;
    }
}

void dfs(int u)
{
    if(vis[u]) return ;
    vis[u]=1;
    if(u>mx){
        ci=mx;
        mx=u;
    }
    else if(u>ci){
        ci=u;
    }

    totn++;
    for(int i=0;i

 

你可能感兴趣的:(图,数据结构)