【题解】[P1407 国家集训队]稳定婚姻

很好的一道建模+图论题。

婚姻关系?很像二分图匹配呀,不过不管怎么办先建模再说。婚姻关系显然用图方面的知识解决。建图!

它给定的是字符串,所以我们使用\(ac\)自动机\(map\)作匹配建点。

题意就是给你\(n\)对夫妻关系和\(m\)对情人关系,已知情人关系都可以结婚,现在假设对于某个婚姻,如果离婚,这\(2n\)个人最终依然能够结合成\(n\)对情侣,那么这样的婚姻是不稳定的。现在问每个婚姻关系的稳定性。

考虑什么样的婚姻关系是不稳定的。题目给的意思是,"这\(2n​\)个人最终依然能够结合成\(n​\)对情侣",我们仔细分析一下,发现如下性质:

  • 依然结合成\(n\)对情侣,和这对情侣没有任何间接或直接关系的人可以忽略。\((*)\)
  • 假设有两对婚姻,加入他们的男方女方分别互为情人关系,这两对婚姻都不稳定。\((**)\)

根据以上两点,我们发现,假若婚姻\(a​\)的一个成员喜欢婚姻\(b​\)的一个成员,那么相当于婚姻\(a​\)和婚姻\(b​\)连接了半条边。假若婚姻\(a​\)的另一个成员也喜欢\(b​\)的另一个成员那么又连了半条边。假设两个婚姻最终形成了一条边,那么他们就不稳定了!

我们考虑令情人中全是女孩子喜欢男孩子(谁叫我是男\(oier\)呢)(笑),婚姻中都是互相连边,那么假设有一个强联通分量里有偶数个人,(且不是偶数不是二),那么在这个强联通分量里的婚姻就是不稳定的。

讲不清楚QAQ直接上代码吧。

#include<bits/stdc++.h>

using namespace std;
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define Max(a,b) ((a)<(b)?(b):(a))
#define Min(a,b) ((a)<(b)?(a):(b))
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >

TMP inline ccf qr(ccf b){
    char c=getchar();
    int q=1;
    ccf x=0;
    while(c<48||c>57)
    q=c==45?-1:q,c=getchar();
    while(c>=48&&c<=57)
    x=x*10+c-48,c=getchar();
    return q==-1?-x:x;
}

const int maxn=4004<<1;
map < string ,int > mp;
int n,m;
struct E{
    int to,nx;
}e[(maxn<<1)+(20001<<1)];
int cnt;
int head[maxn];
bool in[maxn];
int dfn[maxn];
int low[maxn];
int stk[maxn];
int be[maxn];
int siz[maxn];
int timer;
int qaq;
int top;

void dfs(int now){
    stk[++top]=now;
    in[now]=1;
    dfn[now]=low[now]=++timer;
    ERP(t,now){
    if(!dfn[e[t].to]){
        dfs(e[t].to);
        low[now]=Min(low[now],low[e[t].to]);
    }
    else
        if(in[e[t].to])
        low[now]=Min(low[now],dfn[e[t].to]);
    }
    if(dfn[now]==low[now]){
    qaq++;
    register int temp;
    do{
        temp=stk[top--];
        in[temp]=0;
        be[temp]=qaq;
        ++siz[qaq];
    }while(top&&temp!=now);
    }
}

inline void add(int fr,int to,bool f){
    e[++cnt]=(E){to,head[fr]};
    head[fr]=cnt;
    if(f)
    add(to,fr,0);
}

int mapcnt;
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
    string t1,t2;
    n=qr(1);
    RP(t,1,n){
    cin>>t1>>t2;
    mp[t1]=++mapcnt;
    mp[t2]=++mapcnt;
    add(mapcnt,mapcnt-1,1);
    }
    m=qr(1);
    RP(t,1,m){
    cin>>t1>>t2;
    add(mp[t1],mp[t2],0);
    }
    RP(t,1,mapcnt)
    if(!dfn[t])
        dfs(t);
    RP(t,1,n){
    if((siz[be[t<<1]]&1)||siz[be[t<<1]]==2)
        puts("Safe");
    else
        puts("Unsafe");
    }
    return 0;
}

【题解】P1407国家集训队稳定婚姻的更多相关文章

  1. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  2. 洛谷 P1407 [国家集训队]稳定婚姻

    洛谷 这个题面很有意思,像我这样的菜鸡,完全不需考虑婚姻的稳定 性 问题. tarjan裸题,直接讲算法吧: 原配夫妻之间分别连一条边,小情人之间反向连边. 这时候我们会发现一个性质,如果婚姻稳定,那 ...

  3. [Luogu] P1407 [国家集训队]稳定婚姻

    题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...

  4. P1407 [国家集训队]稳定婚姻

    题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...

  5. [洛谷P1407][国家集训队]稳定婚姻

    题目大意:有$n$对夫妻和$m$对情人,如果一对情人中的两人都离婚了,那么他们可以结为夫妻.对于每一对夫妻,若他们离婚后所有人依然可以结婚,那么就是不安全的,否则是安全的.问每一对夫妻是否安全. 题解 ...

  6. 题解【洛谷P1407】 [国家集训队]稳定婚姻

    题面 题解 很好的\(Tarjan\)练习题. 主要讲一下如何建图. 先用\(STL \ map\)把每个人的名字映射成数字. 输入第\(i\)对夫妻时把女性映射成\(i\),把男性映射成\(i+n\ ...

  7. 【题解】国家集训队礼物(Lucas定理)

    [国家集训队]礼物(扩展Lucas定理) 传送门可以直接戳标题 172.40.23.20 24 .1 答案就是一个式子: \[ {n\choose \Sigma_{i=1}^m w}\times\pr ...

  8. 【题解】[国家集训队]Crash的数字表格 / JZPTAB

    求解\(\sum_{i = 1}^{n}\sum_{j = 1}^{m}lcm\left ( i,j \right )\). 有\(lcm\left ( i,j \right )=\frac{ij}{ ...

  9. [题解] LuoguP4827 [国家集训队] Crash 的文明世界

    传送门 这个题......我谔谔 首先可以考虑换根\(dp\),但到后来发现二项式定理展开过后需要维护\(k\)个值,同时每个值也要\(O(k)\)的时间按二项式定理算 当然fft优化过后就是k lo ...

随机推荐

  1. POJ 2484 A Funny Game [博弈]

    题意:n枚硬币围成一个圈,每次每个人可以从中取走一枚或者相邻的两枚(如果两枚硬币原本中间隔着一枚硬币,后来被取走,这两枚硬币不算相邻).谁取走最后一枚硬币谁就赢了. 思路:我们可以找找规律. 首先,n ...

  2. Java NIO.2 Files类的常用方法

    Files类是一个工具类,提供了大量的静态方法来操作文件.文件夹. Files类常用方法: long size(Path  path)    //返回文件大小 boolean  isDirectory ...

  3. Java 在Word创建表格

    表格作为一种可视化交流模式及组织整理数据的手段,在各种场合及文档中应用广泛.常见的表格可包含文字.图片等元素,我们操作表格时可以插入图片.写入文字及格式化表格样式等.下面,将通过Java编程在Word ...

  4. SecureCRT发送键盘按键对应表(转义字符)

    \r 发送回车(CR) \n 发送换行符(LF) \b 发送退格 \e 发送一个转义 \t 发送一个标签 \\ 发送一个反斜杠字符 \v 将剪贴板的内容粘贴到活动状态会话窗口 \p 暂停一秒钟

  5. 详解Webpack2的那些路径

    Webpack2 中有很多涉及路径参数配置,若不知其所以然,很容易混淆出错.本文尽可能的汇集了 Webpack2 中设计路径的配置,力争深入浅出. context context 是 webpack ...

  6. Linux内核Crash分析

    转载自:http://linux.cn/article-3475-1.html 在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为 ...

  7. 聊聊、Zookeeper 客户端 Curator

    [Curator]   和 ZkClient 一样,Curator 也是开源客户端,Curator 是 Netflix 公司开源的一套框架. <dependency> <groupI ...

  8. 【freeCodeCamp】免费晋级前台工程师呦!!!!

    首页地址:https://www.freecodecamp.org/ GitHub:https://github.com/freeCodeCamp/freeCodeCamp ============= ...

  9. STL之pair类型具体分析

    pair定义于头文件utility中.基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型. pair类型提供的操作: pair<T1,T2> p1; pair< ...

  10. OpenCV生成点集的Delaunay剖分和Voronoi图

    实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...