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

#include<cstdio>
#include<iostream>
#include<algorithm>
//#include<queue>
//#include<vector>

#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=2e4+10 ;

map<string , int> cp;//
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
int dfn[maxn],low[maxn],dfstm,st[maxn],top,co[maxn],col;
int n,m;

void add(int u,int v){
    to[++tot]=v,nxt[tot]=head[u],head[u]=tot;
}

void tarjan(int u)
{
    low[u]=dfn[u]=++dfstm; st[++top]=u;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(dfn[v]==0){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(co[v]==0) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        co[u]=++col;
        while(st[top]!=u)
        {
            co[st[top]]=col;
            top--;
        }
        top--;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        string a,b;cin>>a>>b;
        cp[a]=i,cp[b]=n+i;
        add(cp[a],cp[b]);//add(cp[b],cp[a]);
    } 
    cin>>m;
    for(int i=1;i<=m;i++){
        string a,b;cin>>a>>b;
        add(cp[b],cp[a]);//
    }
    for(int i=1;i<=2*n;i++) if(dfn[i]==0) tarjan(i);
    
    for(int i=1;i<=n;i++){
        if(co[i]==co[i+n])    cout<<"Unsafe\n";
        else cout<<"Safe\n";
    }
    return 0;
}

/*

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define N 10005
#define M 300005
 
int n,m; 
map<string,int>cp; // couple 
 
struct node {
    int v,nex;
}e[M];
int tot,h[N];
void add(int u,int v) {
    e[++tot].v=v;
    e[tot].nex=h[u];
    h[u]=tot;
}
 
inline int read() {
    int tmp=0;
    char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') tmp=(tmp<<1)+(tmp<<3)+ch-'0',ch=getchar();
    return tmp;
}
 
bool ins[N];
int s[N],top;
int cnt,belong[N];
int dfn[N],low[N],idx;
void Tarjan(int u) {
    dfn[u]=low[u]=++idx;
    s[++top]=u;
    ins[u]=1;
    for(int i=h[u];i;i=e[i].nex) {
        int v=e[i].v;
        if(!dfn[v]) {
            Tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u]) {
        ++cnt;
        do{
            belong[s[top]]=cnt;
            ins[s[top]]=0;
        }while(s[top--]!=u);
    }
}
 
int main()
{
    n=read();
    string gir,boy;
    for(int i=1;i<=n;++i) {
        cin>>gir>>boy;
        cp[gir]=i;
        cp[boy]=i+n;
        add(i,i+n);
    }
    m=read();
    for(int i=1;i<=m;++i) {
        cin>>gir>>boy;
        add(cp[boy],cp[gir]);
    }
    for(int i=1;i<=n*2;++i) if(!dfn[i]) Tarjan(i);
    for(int i=1;i<=n;++i) {
        if(belong[i]==belong[i+n]) printf("Unsafe\n");
        else printf("Safe\n");
    }
    return 0;
}
*/

 

posted @ 2023-09-17 16:01  JMXZ  阅读(11)  评论(0)    收藏  举报