最近切的两题SCC的tarjan POJ1236 POJ2186
两题都是水题,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的更多相关文章
- MT【249】离心率两题
椭圆$\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的一个焦点为$F$,过$F$的直线交椭圆于$A,B$两点,$M$是点$A$关于原点的对称点.若 ...
- 清橙A1206.小Z的袜子 && CF 86D(莫队两题)
清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...
- 2-SAT两题
看了大白书,学习了一下two-sat,很有意思的算法.题目就是大白书上的两题. 仅仅放一下代码作为以后的模板参考. #include <stdio.h> #include <algo ...
- 「刷题笔记」Tarjan
贴一个讲得非常详细的\(tarjan\)入门教程 信息传递 讲个笑话:我之前用并查集求最小环过的这题,然后看见题目上有个\(tarjan\)标签 留下了深刻的印象:\(tarjan\)就是并查集求最小 ...
- 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733
1.POJ 1733 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5744 Accepted: ...
- Codeforces Round #197 (Div. 2) C,D两题
开了个小号做,C题一开始看错范围,D题看了半小时才看懂,居然也升到了div1,囧. C - Xenia and Weights 给出一串字符串,第i位如果是1的话,表示有重量为i的砝码,如果有该种砝码 ...
- Educational Codeforces Round 58 (Rated for Div. 2) (前两题题解)
感慨 这次比较昏迷最近算法有点飘,都在玩pygame...做出第一题让人hack了,第二题还昏迷想错了 A Minimum Integer(数学) 水题,上来就能做出来但是让人hack成了tle,所以 ...
- noip2016 小结(ac两题+学习总结)
NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...
- <每日一题> Day5:简单递推两题
原题链接 参考代码: #include <iostream> using namespace std; typedef long long ll; + ; ll dp[maxn]; int ...
随机推荐
- ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
按照ASP.NET MVC Identity建立了一個用戶權限管理模塊,由于還要加自己已有的數據庫,所以建立了一個實體模型,建立了之后,發現登錄不了: 一直顯示“Login in failed for ...
- 协程和I/O模型
1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切换,整个线程都阻塞在原地 该线程内的其他的任 ...
- Vue 2.0入门基础知识之全局API
3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...
- 洛谷 P1434 滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 怎么用eclipse生成jar文件?eclipse导出jar介绍
1 .我们先要增加jar需要的配置文件,选中项目的src目录,鼠标右键,选择 [New] -选择 [Folder] . 2. 输入META-INF 作为目录名称,点击[Finish] . 3. 选中刚 ...
- mybatis获取存储过程返回结果
获取存储过程返回结果 代码: // Map<String,Object> map = new HashMap<String,Object>(); map.put("i ...
- vscode setting.json
setting.json { "sync.gist": "#github的码##", "sync.lastUpload": "20 ...
- PHP19 PHPStorm2018和GitHub的使用
目的 使用GitHub的代码仓库进行项目代码托管. 准备工作 1.在GitHub注册账号 https://github.com/ 2.Start a Project 登陆后创建一个项目 3.创建版本仓 ...
- canvas使用自定义字体没有效果
字体样式没有显示主要是因为字体还没有加载完成~ css @font-face { font-family: myFont; src: local('sen.ttf'), url("sen.t ...
- spoj-TSUM Triple Sums
题目描述 题解: 很吊的容斥+$FFT$,但是并不难. 首先,由于有重复,我们要容斥. 怎么办? 记录三个多项式, 只取一个:$w1$; 相同物体拿两个:$w2$; 相同物体拿三个:$w3$; 然后答 ...