[Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa

2023-10-04 03:10

本文主要是介绍[Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
struct pp{struct edge{int u,v,w,next;}ed[200005];int e,head[100005];pp(){e=1;memset(head,0,sizeof head);}void add(int u,int v,int w){ed[e].u=u; ed[e].v=v; ed[e].w=w;ed[e].next=head[u]; head[u]=e++;}
};pp orgp,newp,newf;
int dfn[100005],low[100005],q[100005];
int top=0,tot=0,id[100005],size[100005];
bool bo[100005];void tarjan(int x){dfn[x]=low[x]=++top;q[top]=x; bo[x]=1;for(int i=orgp.head[x];i;i=orgp.ed[i].next){int v=orgp.ed[i].v;if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(bo[v])low[x]=min(low[x],dfn[v]);}if(dfn[x]==low[x]){int y; tot++;do{y=q[top--];bo[y]=0;id[y]=tot;size[tot]++;}while(y!=x);}
}int dis[100005][2];void spfa(pp &ppp,int x,int t){memset(bo,0,sizeof bo);queue<int > q; q.push(x); dis[x][t]=size[x]; int now,v,w;while(!q.empty()){now=q.front(); q.pop(); bo[now]=0;for(int i=ppp.head[now];i;i=ppp.ed[i].next){v=ppp.ed[i].v; w=ppp.ed[i].w;if(dis[v][t]<dis[now][t]+w){dis[v][t]=dis[now][t]+w;if(!bo[v]){bo[v]=1;q.push(v);}}}}
}int n,m;int main()
{//freopen("cown.in","r",stdin);//freopen("cown.out","w",stdout);scanf("%d%d",&n,&m);int u,v;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);orgp.add(u,v,1);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<=m;i++){if(id[orgp.ed[i].u]!=id[orgp.ed[i].v]){newp.add(id[orgp.ed[i].u],id[orgp.ed[i].v],size[id[orgp.ed[i].v]]);newf.add(id[orgp.ed[i].v],id[orgp.ed[i].u],size[id[orgp.ed[i].u]]);}}int ans=-0x7fffffff;memset(dis,-0x3f,sizeof dis);spfa(newp,id[1],0);spfa(newf,id[1],1);for(int i=1;i<newp.e;i++){u=newp.ed[i].u;v=newp.ed[i].v;ans=max(ans,dis[u][1]+dis[v][0]-size[id[1]]);}printf("%d\n",ans);
}
打的好蠢啊QAQ

这篇关于[Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1176

相关文章

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

poj 2449 第k短路 A* + spfa

poj 2449: 题意: 给一张有向图,求第k短路。 解析: A* + spfa。 一下转自:http://blog.csdn.net/mbxc816/article/details/7197228 “描述一下怎样用启发式搜索来解决K短路。 首先我们知道A*的基础公式:f(x)=g(x)+h(x);对h(x)进行设计,根据定义h(x)为当前的x点到目标点t所需要的实际距

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚

【AcWing】852. spfa判断负环

#include<iostream>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int N= 1e5+10;int n,m;int h[N],w[N],e[N],ne[N],idx;int dist[N],cnt[N];//cnt存最短路径的边数bool st[N];v

透析SPFA算法(图例讲解)

SPFA算法是Bellman-Ford的队列优化,所以先介绍Bellman-Ford算法。        Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-

图论篇--代码随想录算法训练营第五十二天打卡| 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿

101. 孤岛的总面积 题目链接:101. 孤岛的总面积 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。 现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。 解题思路: 从周边找到陆地,然后通过 dfs或者bfs 将

代码随想录 刷题记录-28 图论 (5)最短路径

一、dijkstra(朴素版)精讲 47. 参加科学大会 思路 本题就是求最短路,最短路是图论中的经典问题即:给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。 接下来讲解最短路算法中的 dijkstra 算法。 dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。 需要注意两点: dijkstra 算法可以同时求 起点到所有节点的最短路径权值不