luogu3119/bzoj3887 草鉴定 (tarjan缩点+spfa)
首先缩一波点,就变成了一个DAG,边权是出点的大小
那我们走到某个点的时候可能会有两种状态:已经走过反边或者没走过
于是就把一个点拆成两层(x和x+N),第二层的点表示我已经走过反边了,每层中的边和原来一样,但对于边(u,v),我们连一个(v,u+N),表示走了这条边的反边,这条边的边权是u的大小
因为DAG中没有环,所以权值不会被重复计算
然后spfa算从belong[1]到bel[1]+N的最长路就行了
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
const int maxn=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int ne,b,l;
}eg[maxn*];
int egh[maxn*],ect;
int eg1[maxn][],egh1[maxn],ect1;
int N,M,dfn[maxn],low[maxn],stk[maxn],sh,tot,bel[maxn],pct,siz[maxn];
bool instk[maxn]; inline void adeg1(int a,int b){
eg1[++ect1][]=b,eg1[ect1][]=egh1[a],egh1[a]=ect1;
}
inline void adeg(int a,int b,int c){
eg[++ect].b=b,eg[ect].l=c,eg[ect].ne=egh[a],egh[a]=ect;
} void tarjan(int x){
dfn[x]=low[x]=++tot,instk[x]=,stk[++sh]=x;
for(int i=egh1[x];i;i=eg1[i][]){
int b=eg1[i][];
if(!dfn[b]) tarjan(b),low[x]=min(low[x],low[b]);
else if(instk[b]) low[x]=min(low[x],dfn[b]);
}
if(dfn[x]==low[x]){
++pct;
while(){
instk[stk[sh]]=;
bel[stk[sh]]=pct;siz[pct]++;
if(stk[sh--]==x) break;
}
}
} queue<int> q;
int dis[maxn*];
bool flag[maxn*];
inline void spfa(){
q.push(bel[]);
while(!q.empty()){
int p=q.front();q.pop();
flag[p]=;
// printf("!%d\n",p);
for(int i=egh[p];i;i=eg[i].ne){
int b=eg[i].b;
if(dis[b]<dis[p]+eg[i].l){
dis[b]=dis[p]+eg[i].l;
if(!flag[b]) q.push(b);
flag[b]=;
}
}
}
} int main(){
// freopen("testdata.in","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
int a=rd(),b=rd();
adeg1(a,b);
}
for(i=;i<=N;i++)
if(!dfn[i]) tarjan(i);
for(i=;i<=N;i++){
int a=bel[i];
for(j=egh1[i];j;j=eg1[j][]){
int b=bel[eg1[j][]];
if(a==b) continue;
adeg(a,b,siz[b]);
adeg(a+N,b+N,siz[b]);
adeg(b,a+N,siz[a]);
}
}
spfa();
printf("%d\n",dis[bel[]+N]);
return ;
}
luogu3119/bzoj3887 草鉴定 (tarjan缩点+spfa)的更多相关文章
- P3119 [USACO15JAN]草鉴定[SCC缩点+SPFA]
题目描述 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后回到1号草场.她想经过尽可能多的草场,贝西 ...
- 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- 洛谷3119 草鉴定(tarjan)
题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...
- [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA
考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...
- Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划
Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...
- [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)
传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后 ...
- Luogu3119 草鉴定-Tarjan+Topsort
Solution 简单的$Tarjan$题. 有大佬现成博客 就不写了 → 传送门 Code #include<cstdio> #include<cstring> #inclu ...
- [APIO2009]抢掠计划 tarjan缩点+spfa BZOJ1179
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
随机推荐
- JDK8 的FullGC 之 metaspace
JDK8 的FullGC 之 metaspace - 简书https://www.jianshu.com/p/1a0b4bf8d498
- java 8 jvm 内存配置
jdk8内存参数解析与修改(新的参数) - LikeTech - CSDN博客https://blog.csdn.net/lk7688535/article/details/51767333 Java ...
- js根据ip自动获取地址(省市区)
HTML: <html> <head> <meta charset="utf-8"> <meta name="viewport& ...
- 每日一小时linux(1)--sysRq
参考https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/index.html SysRq 是什么 你是否遇到服务器不能通过 SSH 登录,也不 ...
- 使用Guava cache构建本地缓存
前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...
- peewee 事物 回滚
peewee 事物 回滚 #!/usr/bin/env python # coding=utf-8 from peewee import * db = MySQLDatabase(host='123. ...
- 用dbexpress连接sqlserver数据库
SQLConnection1.Params.clearSQLConnection1.Params.Values['ServerName'] := '192.168.0.112'; SQLConnect ...
- 微信小程序wxml無法實現頁面跳轉的問題
wxml的 navigator的url設置后無法跳轉? 檢查要跳轉的頁面是否是在APP.json的tabBar里註冊過,如果是tabBar頁面是不能用wx.navigateTo和wx.Redirect ...
- 导出数据到EXL表格中
项目使用的是SSI框架,通过struts访问到action xml文件: <action name="fabAttributedaochu" class="com. ...
- Thread的其他属性方法
from threading import Thread,currentThread,active_count import time def task(): print('%s is running ...