【题解】[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. CPU、内存、IO虚拟化关键技术及其优化探索

    https://yq.aliyun.com/articles/71295?spm=5176.8091938.0.0.3LQ7NM

  2. Beginning Auto Layout Tutorial in iOS 7: Part 3

    How Auto Layout works 在使用auto layout之前,你可能总是使用initWithFrame或者frame, bounds or center属性. 使用约束的好处在于你不需 ...

  3. 3 Suggested Oracle Certifications For Oracle Form's Developers

    The following are the most suggested Oracle Certifications for Oracle Application Developers in Form ...

  4. hdu1061(C++)

    简单的找规律,不妨设N=10*x+a(a=N%10),那么N^N=(10*x+a)^N,用二项式展开定理可以知道N^N%10=a^N%10; 由于0<a<10,打表a^1,a^2,a^3, ...

  5. DotnetBrowser入门教程-(3)启动与使用简单的WebSocket服务

    websocket是个很好的通信协议,基本可以贯穿支持html5的所有设备.dotnetbrowser内置了对websocket服务端与客户端的支持.请看例子: 1.新建桌面项目,基于.net 4.0 ...

  6. openssl之BIO系列之9---BIO对的创建和应用

    BIO对的创建和应用 ---依据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah@263. ...

  7. Galileo Gen2 之MQTT通讯

    前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. Galileo系统:完整版Yocto,内核版本3.8.7-yocto-standard:宿主机:Windows 7 64 bit 这期主要讲 ...

  8. webstrom 应用 转(http://blog.csdn.net/zghekuiwu/article/details/54382145)

    WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑 ...

  9. servlet实现文件下载所需步骤及说明

      servlet实现文件下载所需步骤及说明 CreateTime--2017年9月1日15:46:22 Author:Marydon 参考链接:http://blog.sina.com.cn/s/b ...

  10. jquery插件范例代码

    // 创建一个闭包 (function($) { // 插件的定义 $.fn.hilight = function(options) { debug(this); // build main opti ...