BZOJ 2140 Tarjan

思路:

跟POJ有一道时限挺长的题一模一样  哦 POJ 1904

题解可以看这个(捂脸)

http://blog.csdn.net/qq_31785871/article/details/52963278

//By SiriusRen
#include <map>
#include <string>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=55555;
int n,m,v[N],next[N],tot,first[N],stk[N],top,jy,p[N],cnt,T,Cnt,dfn[N],low[N],vis[N];
string s1,s2;
map<string,int>mp;
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void tarjan(int x){
    dfn[x]=low[x]=++Cnt,stk[++top]=x,vis[x]=1;
    for(int i=first[x];~i;i=next[i]){
        if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
        else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
    }
    if(low[x]==dfn[x]){
        T++;
        do{
            jy=stk[top--],vis[jy]=0,p[jy]=T;
        }while(jy!=x);
    }
}
int main(){
    memset(first,-1,sizeof(first));
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s1>>s2;
        mp[s1]=++cnt,mp[s2]=++cnt;
        add(cnt,cnt-1);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        cin>>s1>>s2;
        add(mp[s1],mp[s2]);
    }
    for(int i=1;i<=cnt;i++)if(!dfn[i])tarjan(i);
    for(int i=1;i<=n;i++){
        puts(p[i*2]!=p[i*2-1]?"Safe":"Unsafe");
    }
}
时间: 2024-10-18 11:11:12

BZOJ 2140 Tarjan的相关文章

BZOJ 2140 稳定婚姻

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2140 题意:已知n对夫妻的婚姻状况,称第i对夫 妻的男方为Bi,女方为Gi.若某男Bi与某女Gj曾经交往过,则当某方与其配偶(即Bi与Gi或Bj与Gj)感情出现问题时,Bi与Gj有私奔的可能 性.不妨设Bi和其配偶Gi感情不和,于是Bi和Gj旧情复燃,进而Bj因被戴绿帽而感到不爽,联系上了他的初恋情人Gk……一串串的离婚事件像多米诺骨 牌一般接踵而至.若在Bi和Gi离婚的前提下,这2n

10.2考试总结

你没看错,国庆第二天我就来了 第一题:基本都能水到分,这道题暴力枚举+dfs即可,注意需要两遍dfs 第二题: 这题说白了考的知识点我还没学=w= 为了以后看,我就把题解复制上去吧 问题1,最少死几个人: 没有入度的点必然不死,不死的点指向的点必死.使用拓扑排序实现,若最后剩下环且环上所有点都不死,则每个环死亡人数为(L+1)/2. 问题2,最多死几个人: 没有入度的点必然不死,若存在没有叶子且长度大于1的环,则该环上有一个人不死.其余人都可以死亡. http://blog.csdn.net/p

bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan索环&amp;&amp;环上单调队列

1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][Status] Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路

[BZOJ 1179]ATM题解 Tarjan缩点+SPFA

[BZOJ 1179]ATM题解 Tarjan缩点+SPFA Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来一行包含两个整数S.P,S表示市中心的编号,也就是出发的路口.P表示酒吧数目.接下来的一行中有P个整数,表示P个有酒吧的路口的编号 Output 输出一个整数,

【tarjan】BZOJ 1051:受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1642[Submit][Status][Discuss] Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. Inp

[BZOJ 1051][HAOI 2006]受欢迎的牛(tarjan缩点)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051 唔...这题好像在POJ上见过? 比较水的题,很好想出思路.牛和牛之间的关系就像有向图,牛a喜欢牛b相当于建立有向边a->b,然后在这个有向图中,每个强连通分量里的牛们相当于是相互喜欢的,把这个图缩点成DAG,DAG里如果有且仅有一个出度为0的点,则这个点对应强连通分量里的所有牛都是受欢迎的牛,如果没有出度为0的点,当然就没受欢迎的牛了,如果出度为0的点的个数大于1,则每个出度为0的

BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. --------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; ++i) #define clr(x, c) memset(x, c, sizeof(x)) #define foreach(i,

bzoj 1179[Apio2009]Atm (tarjan+spfa)

题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数.接下来一行包含两个整数S.P,S表示市中心的编号,也就是出发的路口.P表示酒吧数目.接下来的一行中有P个整数,表示P个有酒吧的路口的编号 输出 输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数. 样例输入 6 7 1

BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )

WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就是记忆化搜一下...重边就用set判一下 ------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring