zoukankan      html  css  js  c++  java
  • BZOJ2140 稳定婚姻[强连通分量]

    发现如果$B_i$和$G_j$配对,那么$B_j$又要找一个$G_k$配对,$B_k$又要找一个$G_l$配对,一直到某一个$B_x$和$G_i$配对上为止,才是不稳定的。

    暴力是二分图匹配、匈牙利算法(据说可过)。仔细观察,将配对关系和潜在关系全连边,不稳定的结果则是一个环。

    但是不能直接就这样找。因为无向的话,并不能保证$B_i$和$G_j$配对后就一定从$G_j$走向$B_j$。所以为了保证走向正确,需要定一下向。

    将所有$G$点(糟糕的名称)连边指向他对应的配偶$B$点,然后所有$B$点将自己有的潜在关系连边指向$G$点。这样,每个$B$只有一个入度(从原来配对的$G$过来),然后再重新走向一个新的$G$点......

    是不是超有道理的。。。所以每对点在不在一个简单环上,换言之,因为两点间连了一条边,只要看这条边在不在一个SCC上(边在SCC上和在简单环上是等价的,不过但两点在SCC上和在简单环上不一定等价)即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 #define mst(x) memset(x,0,sizeof x)
     9 #define dbg(x) cerr << #x << " = " << x <<endl
    10 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
    11 using namespace std;
    12 typedef unsigned long long ull;
    13 typedef long long ll;
    14 typedef double db;
    15 typedef pair<int,int> pii;
    16 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    17 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    18 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    19 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    20 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    21 template<typename T>inline T read(T&x){
    22     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    23     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    24 }
    25 const int N=1e5+7,base=13331;
    26 struct thxorz{int to,nxt;}G[N];
    27 char s[10];
    28 int Head[N],frm[N],tot;
    29 int n,m,k;
    30 inline void Addedge(int x,int y){G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot;frm[tot]=x;}
    31 map<ull,int> mp;
    32 inline int Read(){
    33     scanf("%s",s+1);int len=strlen(s+1);ull ha=0;
    34     for(register int i=1;i<=len;++i)ha=ha*base+s[i]-'A'+1;
    35     if(mp.find(ha)==mp.end())mp[ha]=++n;
    36     return mp[ha];
    37 }
    38 #define y G[j].to
    39 int dfn[N],low[N],stk[N],instk[N],Top,cnt,bel[N];
    40 void tarjan(int x){
    41     dfn[x]=low[x]=++cnt,stk[++Top]=x,instk[x]=1;
    42     for(register int j=Head[x];j;j=G[j].nxt){
    43         if(!dfn[y])tarjan(y),MIN(low[x],low[y]);
    44         else if(instk[y])MIN(low[x],dfn[y]);
    45     }
    46     if(dfn[x]==low[x]){
    47         int tmp;
    48         do instk[tmp=stk[Top--]]=0,bel[tmp]=x;while(tmp^x);
    49     }
    50 }
    51 #undef y
    52 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    53     read(k);
    54     for(register int i=1,x,y;i<=k;++i)x=Read(),y=Read(),Addedge(x,y);
    55     read(m);
    56     for(register int i=1,x,y;i<=m;++i)x=Read(),y=Read(),Addedge(y,x);
    57     for(register int i=1;i<=n;++i)if(!dfn[i])tarjan(i);
    58     for(register int i=1,x,y;i<=k;++i){
    59         x=frm[i],y=G[i].to;//dbg2(x,y);
    60         puts(bel[x]^bel[y]?"Safe":"Unsafe");
    61     }
    62     return 0;
    63 }
    View Code

    总结:一些匹配关系,可以转化为有向图,或者对图定向来完成转化,然后使用tarjan找SCC处理环问题。

  • 相关阅读:
    对象,类、面向对象编程
    subprocess 模块
    JVM 内存分配和垃圾回收(GC)机制
    JVM类加载机制
    【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
    【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
    【转】Java中的String为什么是不可变的? -- String源码分析
    【转】Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例
    【转】Java 集合系列09之 Map架构
    【转】Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11715281.html
Copyright © 2011-2022 走看看