解题:USACO15JAN Grass Cownoisseur
解题
首先缩点没啥可说的,然后考虑枚举这次逆行的边。具体来说在正常的图和反图上各跑一次最长路,然后注意减掉起点的贡献,用拓扑排序实现(我这里瞎写了个Bellman_Ford,其实在DAG上这好像和拓扑排序的复杂度是一样的=。=)
一个细节:注意可能整个图是个强连通分量,所以答案初始是起点所在的强联通分量的大小
1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=100005; 7 int dfn[N],low[N],col[N],stk[N],ins[N],inq[N],siz[N],dis[2][N]; 8 int p[N],noww[N],goal[N],P[N][2],Noww[N][2],Goal[N][2]; 9 int n,m,c,t1,t2,cnt,cnt0,cnt1,tot,top,ans; 10 queue<int> qs; 11 void link(int f,int t) 12 { 13 noww[++cnt]=p[f]; 14 goal[cnt]=t,p[f]=cnt; 15 } 16 void relink(int f,int t) 17 { 18 Noww[++cnt0][0]=P[f][0]; 19 Goal[cnt0][0]=t,P[f][0]=cnt0; 20 Noww[++cnt1][1]=P[t][1]; 21 Goal[cnt1][1]=f,P[t][1]=cnt1; 22 } 23 void Tarjan_SCC(int nde) 24 { 25 dfn[nde]=low[nde]=++tot; 26 stk[++top]=nde,ins[nde]=true; 27 for(int i=p[nde];i;i=noww[i]) 28 if(!dfn[goal[i]]) 29 Tarjan_SCC(goal[i]),low[nde]=min(low[nde],low[goal[i]]); 30 else if(ins[goal[i]]) 31 low[nde]=min(low[nde],low[goal[i]]); 32 if(dfn[nde]==low[nde]) 33 { 34 c++; int tmp; 35 do 36 { 37 tmp=stk[top--]; 38 ins[tmp]=false; 39 col[tmp]=c,siz[c]++; 40 }while(nde!=tmp); 41 } 42 } 43 void Bellman_Ford(int s,int t) 44 { 45 memset(dis[t],0xc0,sizeof dis[t]); 46 dis[t][s]=siz[s],qs.push(s),inq[s]=true; 47 while(!qs.empty()) 48 { 49 int tn=qs.front(); 50 qs.pop(),inq[tn]=false; 51 for(int i=P[tn][t];i;i=Noww[i][t]) 52 if(dis[t][Goal[i][t]]<dis[t][tn]+siz[Goal[i][t]]) 53 { 54 dis[t][Goal[i][t]]=dis[t][tn]+siz[Goal[i][t]]; 55 if(!inq[Goal[i][t]]) 56 qs.push(Goal[i][t]),inq[Goal[i][t]]=true; 57 } 58 } 59 } 60 int main() 61 { 62 scanf("%d%d",&n,&m); 63 for(int i=1;i<=m;i++) 64 scanf("%d%d",&t1,&t2),link(t1,t2); 65 for(int i=1;i<=n;i++) 66 if(!dfn[i]) Tarjan_SCC(i); 67 for(int i=1;i<=n;i++) 68 for(int j=p[i];j;j=noww[j]) 69 if(col[i]!=col[goal[j]]) 70 relink(col[i],col[goal[j]]); 71 Bellman_Ford(col[1],0),Bellman_Ford(col[1],1),ans=siz[col[1]]; 72 for(int i=1;i<=c;i++) 73 for(int j=P[i][1];j;j=Noww[j][1]) 74 ans=max(ans,dis[0][i]+dis[1][Goal[j][1]]-siz[col[1]]); 75 printf("%d",ans); 76 return 0; 77 }
View Code
转载于:https://www.cnblogs.com/ydnhaha/p/9839732.html
解题:USACO15JAN Grass Cownoisseur相关推荐
- 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)
P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- [USACO15JAN]草鉴定Grass Cownoisseur
tarjan缩点+最短路 这道题我想了一半的正解,就是缩点+DAG上考虑,之后图只有一种情况:1号点连着大量的点,大量的点连着1号点,部分能到达1号点的点连接着1号点能到达的部分点.转向就是要从1号点 ...
- 拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur
https://www.luogu.org/problem/show?pid=3119 本来我是来练习tarjan的,结果tarjan部分直接copy了,反而拓扑排序部分想了好久: 这道题SZB大神两 ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur 缩点 topo或最长路
题意:n个点 m条有向边,可以来回走一个点,问在可以逆行一次的情况下最多有能经过多少个不同的点. 解: 先缩点去环建新图,新图建正序(表示以1为起点到达的点)和逆序(以1为终点到达的点) ,然后最长路 ...
- 图论复习(各类习题)
可以结合这篇博客进行复习:http://www.cnblogs.com/z360/p/7363034.html 一.强连通分量.缩点 习题: 洛谷--P2746 [USACO5.3]校园网Networ ...
- tarjan习题题解
tarjan习题 一.割点: 1.模板: 洛谷P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面 ...
- 2019.2-2019.3 TO-DO LIST
DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
最新文章
- 序列信号产生器的verilog HDL 设计
- 设计模式 策略模式
- campus bike at stanford
- HTTP协议(5)HTTP请求和响应
- 构建高可用服务器之 Keepalive参数详解
- [COCI] Zamjena
- 新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴
- MySQL系列(一) MySQL体系结构概述
- jenkins 执行构建 并查看结果
- 在Mac电脑的输入法中如何开启自动纠正模糊拼音功能?
- Hibernate 学习的书-夏昕(1)
- power oj 2825: 拔河大赛(并查集)
- HHUOJ 1019 Friendship of Mouse(水题)
- 10麦客和300挖藕人
- 凸函数二阶条件的理解及常见函数解析
- 迷宫问题 深度优先搜索【c++】
- iOS 获取当前时间之后N天的日期
- mybatis与hibernate的对比
- 图片翻译成中文怎么弄?分享三个图片翻译小技巧
- Python自动点击鼠标脚本