【不可能的任务14/200】bzoj1051Tarjan裸题

tarjan缩点+判断出度为0的点

所以不需要新建边

 1 #include <cstdio>
 2 int n,m,p,q,N=0,time=0,T=0,sum=0,ans=0;
 3 int from[50001],to[50001],nex[50001],fir[10001],dfn[10001],low[10001],l[10001],tar[10001],gui[10001],c[10001];
 4 bool que[10001];
 5 void add(int p,int q){    from[++N]=p,to[N]=q,nex[N]=fir[p],fir[p]=N;}
 6 int min(int p,int q){    return (p<q)?p:q;}
 7 void dfs(int k)
 8 {
 9     dfn[k]=low[k]=++time,l[++T]=k,que[k]=1;
10     for(int o=fir[k];o;o=nex[o])
11         if(!dfn[to[o]])
12             dfs(to[o]),low[k]=min(low[k],low[to[o]]);
13         else
14             if(que[to[o]])
15                 low[k]=min(low[k],dfn[to[o]]);
16     if(dfn[k]==low[k])
17     {
18         sum++;
19         while(l[T]!=k)
20             que[l[T]]=0,tar[l[T--]]=sum,gui[sum]++;
21         que[k]=0;tar[k]=sum;T--;gui[sum]++;
22     }
23 }
24 int main()
25 {
26     scanf("%d%d",&n,&m);
27     for(int i=1;i<=m;i++)
28         scanf("%d%d",&p,&q),add(p,q);
29     for(int i=1;i<=n;i++)
30         if(!dfn[i]) dfs(i);
31     for(int i=1;i<=N;i++)
32     if(tar[from[i]]!=tar[to[i]])
33         c[tar[from[i]]]=1;
34     for(int i=1;i<=sum;i++)
35         if(!c[i])
36             if(ans){    printf("0\n");return 0;}
37             else ans=gui[i];
38     printf("%d\n",ans);
39     return 0;
40 }

tarjan差点写错,心碎

时间: 2024-08-02 15:36:29

【不可能的任务14/200】bzoj1051Tarjan裸题的相关文章

【不可能的任务22/200】【填坑】bzoj3224 splay裸题

人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 1 #include <cstdio> 2 int root,N=0,n,p,q; 3 int fa[100001],c[100001][2],size[100001],sp[100001]; 4 void rot(int x) 5 { 6 int y=fa[x],k=(c[y][0]==x); 7 size[y]=size[c[y][k]]+size[c[x][k]]+1;size[x]=size[c[x][!k]]+

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

POJ 3624 Charm Bracelet(01背包裸题)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

tarjan讲解(用codevs1332(tarjan的裸题)讲解)

主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量. 在上面这张有向图中1,2,3,4形成了一个强连通分量,而1,2,4,和1,3,4并不是(因为它们并不是极大强连通子图). tarjan是用dfs来实现的(用了tarjan后我们就可以对图进行缩点(当然这道裸题用不到)) 这道题只要

HDU 2602 Bone Collector(01背包裸题)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 60469    Accepted Submission(s): 25209 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bo

POJ 2195 Going Home 最小费用流 裸题

给出一个n*m的图,其中m是人,H是房子,.是空地,满足人的个数等于房子数. 现在让每个人都选择一个房子住,每个人只能住一间,每一间只能住一个人. 每个人可以向4个方向移动,每移动一步需要1$,问所有人移动到房子里的最少花费. 其中,n,m<=100,最多有100个人. 最小给用流裸题. 建立一个超级源点,跟每一个房子连一条边,容量为1,花费为0 每一个人与超级汇点连一条边,容量为1,花费为0 一个房子与每一个人建一条边,房子指向人,容量为1,花费用2者的距离(不是直线距离) 然后跑最小费用流算

POJ 2234 Matches Game(Nim博弈裸题)

Description Here is a simple game. In this game, there are several piles of matches and two players. The two player play in turn. In each turn, one can choose a pile and take away arbitrary number of matches from the pile (Of course the number of mat

BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现

POJ 3468 线段树裸题

这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了ACdreamer的模板,在此基础上自己用宏定义来精简了一下代码: 1 #include<cstdio> 2 typedef long long LL; 3 #define root int rt, int l, int r 4 #define lson rt*2, l, mid 5 #define