还有五天就是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. [转]Anatomy of a Program in Memory

    Memory management is the heart of operating systems; it is crucial for both programming and system a ...

  2. Spark的历史与发展(目录)

    对于一个具有相当技术门槛与复杂度的平台,Spark从诞生到正式版本的成熟,经历的时间如此之短,让人感到惊诧.2009年,Spark诞生于伯克利大学AMPLab,最开初属于伯克利大学的研究性项目.它于2 ...

  3. CentOS 7下升级Python版本到3.x系列

    由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...

  4. WebSocket 理论知识整理

    最近工作用到websocket, 之前虽然也用到了一些简单的东西,但是并没有认真整理一下.所以这次准备了解一下WebSocket. WebSocket产生的背景 WebSocket是一种在单个TCP连 ...

  5. users-and-groups-in-linux

    https://www.tecmint.com/compress-files-and-finding-files-in-linux/ https://www.tecmint.com/manage-us ...

  6. 博客搬家了,新域名dinphy.wang

    博客搬家了,新域名      dinphy.wang 博客搬家了,新域名      www.dinphy.wang 博客搬家了,新域名      dinphy.wang 博客搬家了,新域名     w ...

  7. IE8 下更改input[file] file文件选择框样式

    1/使用绝对定位,将文件选择框固定,并且隐藏该选择框(文件选择框可调整宽高),设置该文件选择框 z-index 调高 比如 999. 2/使用任意标签,调整为与上面选择框相同宽高,目的为使用该标签样式 ...

  8. quartz与spring boot-最简模式

    多年前使用过quartz,今天又需要再用,而且是在spring boot框架下.很神奇,spring也是十年前用过的. 这里仅记录下完成的最快速和简单的操作,高级的使用以后有空弄明白了再写: 1.增加 ...

  9. Sword 内核队列二

    #ifndef __GTC_FIFO_H_ #define __GTC_FIFO_H_ #ifndef GTC_MAX #define GTC_MAX(a,b) ((a) > (b) ? (a) ...

  10. 使用python脚本实现iOS图片资源压缩

    最近公司有一个新的需求,要把代码进行瘦身,这篇博客记录下如何对图片进行压缩的. 原理: 写一个脚本,把图片文件夹'.xcassets'的所有文件遍历出来,然后使用一个第三方的算法把图片压缩后再替换回去 ...