两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书
POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点)
//poj1236
#include<iostream>
#include<cstdio>
#include<string.h>
#define maxn 6000
int now=0,next[maxn],head[maxn],point[maxn],num=0,dfn[maxn],low[maxn],instack[maxn];
int stack[maxn],belong[maxn],top,count,in[maxn],out[maxn];
int min(int a,int b)
{
    if (a<b)return a;else return b;
}
int max(int a,int b)
{
    if (a>b)return a;else return b;
}
void add(int x,int y)
{
    next[++now]=head[x];
    head[x]=now;
    point[now]=y;
}
void tarjan(int k)
{
    int u;
    instack[k]=true;
    dfn[k]=low[k]=++num;stack[++top]=k;
    for(int i=head[k];i!=0;i=next[i])
    {
        u=point[i];
        if (dfn[u]==0)
        {
            tarjan(u);
            low[k]=min(low[k],low[u]);
        }
        else if (instack[u])low[k]=min(dfn[u],low[k]);
    }
    if (low[k]==dfn[k])
    {
        ++count;
        do
        {
            u=stack[top--];
            instack[u]=false;
            belong[u]=count;
        }while(u!=k);
    }
}
int main()
{
    int n,t;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)while (1)
    {
        scanf("%d",&t);
        if (t==0)break;
        else add(i,t);
    }
    for(int i=1;i<=n;i++)if (dfn[i]==0)tarjan(i);
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j!=0;j=next[j])
        {
            int u=point[j];
            if (belong[i]!=belong[u])
            {
                out[belong[i]]++;
                in[belong[u]]++;
            }
        }
    }
    int countout=0,countin=0;
    for(int i=1;i<=count;i++)
    {
        if (out[i]==0)countout++;
        if (in[i]==0)countin++;
    }
    if (count==1)printf("1\n0\n");
    else printf("%d\n%d\n",countin,max(countout,countin));
    return 0;
}
 

//poj2186

#include<iostream>

#include<cstdio>

#include<string.h>

#define maxn 50010

using namespace std;

intnow=0,next[maxn],head[maxn],point[maxn],num=0,dfn[maxn],low[maxn],instack[maxn];

int stack[maxn],belong[maxn],top,count,out[maxn],p[maxn];

void add(int x,int y)

{

next[++now]=head[x];

head[x]=now;

point[now]=y;

}

void tarjan(int k)

{

instack[k]=1;

stack[++top]=k;

low[k]=dfn[k]=++num;

int u;

for(inti=head[k];i!=0;i=next[i])

{

u=point[i];

if (dfn[u]==0)

{

tarjan(u);

low[k]=min(low[u],low[k]);

}

else if (instack[u]==1)low[k]=min(dfn[u],low[k]);

}

if (low[k]==dfn[k])

{

++count;

do

{

u=stack[top--];

instack[u]=0;

belong[u]=count;

p[count]++;

}while(u!=k);

}

}

int main()

{

int n,m,x,y,ans=0;

scanf("%d%d",&n,&m);

for(int i=1;i<=m;i++)

{

scanf("%d%d",&x,&y);

add(x,y);

}

for(int i=1;i<=n;i++)

if (dfn[i]==0)tarjan(i);

for(int i=1;i<=n;i++)

{

for(int j=head[i];j!=0;j=next[j])

{

int u=point[j];

if(belong[i]!=belong[u])out[belong[i]]++;

}

}

int flag=0;

for(inti=1;i<=count;i++)

{

if (ans!=0 &&out[i]==0){flag=1;break;}

if(out[i]==0)ans=p[i];

}

if(flag==0)printf("%d\n",ans);else printf("0\n");

return 0;

}

最近切的两题SCC的tarjan POJ1236 POJ2186的更多相关文章

  1. MT【249】离心率两题

    椭圆$\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的一个焦点为$F$,过$F$的直线交椭圆于$A,B$两点,$M$是点$A$关于原点的对称点.若 ...

  2. 清橙A1206.小Z的袜子 && CF 86D(莫队两题)

    清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...

  3. 2-SAT两题

    看了大白书,学习了一下two-sat,很有意思的算法.题目就是大白书上的两题. 仅仅放一下代码作为以后的模板参考. #include <stdio.h> #include <algo ...

  4. 「刷题笔记」Tarjan

    贴一个讲得非常详细的\(tarjan\)入门教程 信息传递 讲个笑话:我之前用并查集求最小环过的这题,然后看见题目上有个\(tarjan\)标签 留下了深刻的印象:\(tarjan\)就是并查集求最小 ...

  5. 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733

    1.POJ 1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5744   Accepted: ...

  6. Codeforces Round #197 (Div. 2) C,D两题

    开了个小号做,C题一开始看错范围,D题看了半小时才看懂,居然也升到了div1,囧. C - Xenia and Weights 给出一串字符串,第i位如果是1的话,表示有重量为i的砝码,如果有该种砝码 ...

  7. Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)

    感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...

  8. noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...

  9. <每日一题> Day5:简单递推两题

    原题链接 参考代码: #include <iostream> using namespace std; typedef long long ll; + ; ll dp[maxn]; int ...

随机推荐

  1. php数组与字符串转换

    1.将字符串转换成数组的几个函数: (1)explode(separate,string) 示例:$str = "Hello world It's a beautiful day" ...

  2. CF989C A Mist of Florescence

    思路: 有趣的构造题. 实现: #include <bits/stdc++.h> using namespace std; ][]; void fillin(int x, int y, c ...

  3. java 之 插入排序

    思想:将一个数组分成两组,左边那组始终有序,每次取右边那组插入到左边适当的位置,保证左边有序,当右边没有需要插入的数据的时候,整个数组是有序的.插入排序是稳定排序. 注:此图引用自https://ww ...

  4. 架包Error inflating class错误

    当引用架包后,出现Error inflating class错误时通常要检测架包是否正确引用: 1.首先将你所需要的架包拷贝到工程目录下: 2.右击工程,选择Build Path-->confi ...

  5. Java虚拟机性能调优相关

    一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代)Tenured(年老代)永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动 ...

  6. 8.3.3 快速系统调用 —— XP SP3上SystemCallStub的奇怪问题

    依书上的例子,ReadFile()函数会调用ntdll!NtReadFile(),后者将服务号放到eax之中,然后调用SharedUserData!SystemCallStub(),由此函数执行sys ...

  7. whatis命令

    whatis——于查询一个命令执行什么功能 示例1: # whatis ls 显示ls命令的功能,和执行man命令时NAME信息差不多

  8. 记一次mysql优化操作

    这次操作,起因是需要获取用户来源及用户性别,而用户的性别信息在第三方授权的中有,存为JSON格式, 不想用php去解析获取,所以试试mysql操作 如果你有更好的解决方案,请留言告诉我! 情景简化 表 ...

  9. Python 中print 和return 的区别

    1.print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上. 2.return return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的retu ...

  10. Java中wait()方法为什么要放在同步块中?(lost wake-up 问题)

    问题起源 事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起. 这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现. 假 ...