还有五天就是NOIP2018了……本蒟蒻还要复习期中考试,因此实在没有时间写博客了(各种找借口)。这里就放一下代码

//Tarjan缩点
//题目描述:给一个有向图。每个点有一个权值,求权值和最大的路径的权值和
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#define MAXN 10005
#define MAXM 100005
using namespace std; inline int read()
{
int f=,x=;
char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-; ch=getchar();}
while(ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
} int n,m;
int cnt,num,tot,ans;
int u[MAXM],v[MAXM],head[MAXN],nxt[MAXM];//邻接表部分
int dfn[MAXN],low[MAXN];//tarjan部分
bool book[MAXN];
stack <int> s;
int p[MAXN],sd[MAXN],in_d[MAXN],dis[MAXN];//缩点+拓扑部分
queue <int> q; void add(int x,int y)
{
u[++cnt]=x;//存起点以供后续重新建图使用
v[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
} void tarjan(int x)
{
dfn[x]=low[x]=++num;
book[x]=;
s.push(x);
for(int i=head[x];i;i=nxt[i])//标准tarjan
{
int t=v[i];
if(!dfn[t])
{
tarjan(t);
low[x]=min(low[x],low[t]);
}
else if(book[t])
low[x]=min(low[x],dfn[t]);
}
if(low[x]==dfn[x])
{
tot++;
while(s.top()!=x)
{
int y=s.top();
book[y]=;
p[x]+=p[y];//缩点的权值
sd[y]=x;//缩点标记
s.pop();
}
book[x]=;
sd[x]=x;
s.pop();
}
} int main()
{
int i;
int x,y;
n=read(); m=read();
for(i=;i<=n;i++) p[i]=read();
for(i=;i<=m;i++)
{
x=read();
y=read();
add(x,y);//有向图
}
for(i=;i<=n;i++)
if(!dfn[i])
tarjan(i); memset(head,,sizeof(head));
memset(nxt,,sizeof(nxt));
for(i=;i<=m;i++)//将缩后的点重新建图
{
x=sd[u[i]],y=sd[v[i]];
if(x!=y)
{
add(x,y);
in_d[y]++;//每个点的入度(拓扑使用)
}
}
for(i=;i<=n;i++)//利用拓扑搞dp,求最大权值路径
{
if(sd[i]==i && !in_d[i])
{
q.push(i);
dis[i]=p[i];//记得要把自己开始时的权值设成点权
}
}
while(!q.empty())
{
int x=q.front(); q.pop();
for(i=head[x];i;i=nxt[i])
{
int t=v[i];
dis[t]=max(dis[t],dis[x]+p[t]);
in_d[t]--;
if(!in_d[t]) q.push(t);//入度等于零,根据拓扑,入队
}
}
for(i=;i<=n;i++)
ans=max(ans,dis[i]);
printf("%d",ans);
return ;
}


//Tarjan求割点
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 20005
#define MAXM 200005
using namespace std; inline int read()
{
int f=,x=;
char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-; ch=getchar();}
while(ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
} int n,m;
int cnt,num,ans;
int v[MAXM],head[MAXN],nxt[MAXM];
int dfn[MAXN],low[MAXN];
bool cut[MAXN];
int i,j; void add(int a,int b)
{
v[++cnt]=b;
nxt[cnt]=head[a];
head[a]=cnt;
} void tarjan(int x,int fa)
{
int Child=;
dfn[x]=low[x]=++num;
for(int i=head[x];i;i=nxt[i])
{
int nx=v[i];
if(!dfn[nx])
{
tarjan(nx,fa);
low[x]=min(low[x],low[nx]);
Child++;
if(x!=fa && dfn[x]<=low[nx])
cut[x]=;
}
else low[x]=min(low[x],dfn[nx]); //这行不要写错
}
if(x==fa && Child>=)
cut[x]=;
} int main()
{
int i;
int a,b;
n=read(); m=read();
for(i=;i<=m;i++)
{
a=read();
b=read();
add(a,b);
add(b,a);
}
for(i=;i<=n;i++)
if(!dfn[i])
tarjan(i,i);
for(i=;i<=n;i++)
if(cut[i]) ans++;
printf("%d\n",ans);
for(i=;i<=n;i++)
if(cut[i])
printf("%d ",i);
return ;
}

~NOIP2018 加油~

tarjan代码的更多相关文章

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

    主要借助这道比较裸的题来讲一下tarjan这种算法 tarjan是一种求解有向图强连通分量的线性时间的算法.(用dfs来实现) 如果两个顶点可以相互通达,则称两个顶点强连通.如果有向图G的每两个顶点都 ...

  2. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  3. 强连通分量(tarjan求强连通分量)

    双DFS方法就是正dfs扫一遍,然后将边反向dfs扫一遍.<挑战程序设计>上有说明. 双dfs代码: #include <iostream> #include <cstd ...

  4. [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

    Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...

  5. 利用Tarjan算法解决(LCA)二叉搜索树的最近公共祖先问题——数据结构

    相关知识:(来自百度百科)  LCA(Least Common Ancestors) 即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 例如: 1和7的最近公共祖先为5: 1和5的 ...

  6. Tarjan模板题——牛的舞会

    题目描述 约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一 ...

  7. POJ 1236 Network of Schools(tarjan)题解

    题意:一个有向图.第一问:最少给几个点信息能让所有点都收到信息.第二问:最少加几个边能实现在任意点放信息就能传遍所有点 思路:把所有强连通分量缩成一点,然后判断各个点的入度和出度 tarjan算法:问 ...

  8. HDU 4685 Prince and Princess 二分图匹配+tarjan

    Prince and Princess 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 Description There are n pri ...

  9. POJ 3648 Wedding(2-SAT的模型运用+DFS | Tarjan)

    Wedding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 3170   Specia ...

随机推荐

  1. What is a Back Order

    What is a Back Order A back order is a customer order that has not been fulfilled. A back order gene ...

  2. 论如何优雅的自定义ThreadPoolExecutor线程池

    更好的markDown阅读体验可直接访问我的CSDN博客:https://blog.csdn.net/u012881584/article/details/85221635 前言 线程池想必大家也都用 ...

  3. HLS playlist典型示例

    [时间:2018-06] [状态:Open] [关键词:流媒体,HLS,m3u8,playlist,variant, alternate] 0 引言 本文主要是对apple官网上的echnical N ...

  4. REST与SOA两种架构的异同

    REST的特性 它基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格.特征如下: 1.网络上的资源都被抽象为资源,这些资源都具有唯一的统一资源标识符(URI:Uniform Reso ...

  5. DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。

    UDP编程: DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流. DatagramPacket(信件):数据包,是UDP下进行传输数 ...

  6. [redis] mac下redis安装、设置、启动停止

    From: https://www.cnblogs.com/shoren/p/redis.html 下载安装 需要下载release版本,下载地址: http://download.redis.io/ ...

  7. [踩坑日记]spring mvc

    目录 找不到javax.servlet.ServletException的类文件 idea 清除tomcat缓存 IOException parsing XML document from Servl ...

  8. Spring-Cloud-Ribbon学习笔记(一):入门

    简介 Spring Cloud Ribbon是一个基于Http和TCP的客户端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署,但是它几乎 ...

  9. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库03 —— 安装HAWQ 2.3.0.0

    一. HAWQ2.3.0环境准备[全部主机节点]: 1, vim /etc/sysctl.conf,编辑如下内容: kernel.shmmax= kernel.shmmni= kernel.shmal ...

  10. 如何通过ajax来获取返回值

    preface 今天使用ajax向后端取数据的时候,按照正常的写法,死活return不了值,所以看了下ajax的帮助手册,发现了这个参数async:false,这个参数是说async表示不是异步执行了 ...