牛客寒假算法基础集训营3-B-处女座的比赛资格(DAG上的最短路)

本文主要是介绍牛客寒假算法基础集训营3-B-处女座的比赛资格(DAG上的最短路),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:https://ac.nowcoder.com/acm/contest/329/B

思路:首先这题可以用最短路来搞,只不过题目说行程不会形成环,也就是DAG图(有向无环图),spfa会超时,有负权值的边也不能用dijkstra,既然是DAG图那起点的入度必为0,我们可以用拓扑排序,去边的时候更新花费,然后判断两种花费情况即可。

AC代码1:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
#define inf 0x3f3f3f3f
#define pii pair<int, int>
int n, m, s, t;
int d[maxn], vis[maxn], dep[maxn];
struct node{int u, to, w, cnz,jffzr;
}a[maxn];
vector <pii> E[maxn];
void init()
{for(int i = 0; i <= n; i++) E[i].clear();memset(d,0x3f,sizeof(d));memset(vis,0,sizeof(vis));memset(dep, 0, sizeof(dep));
}
int Topo()
{queue <int> Q;for(int i = 1; i <= n; i++)if(dep[i] == 0) Q.push(i);d[1] = 0;while(!Q.empty()){int now = Q.front();Q.pop();for(int j = 0; j < E[now].size(); j++){int v = E[now][j].first;if(d[v] > d[now]+E[now][j].second)d[v] = d[now]+E[now][j].second;if(--dep[v] == 0) Q.push(v);}}return max(0, d[n]);
}
int main()
{int t; scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i = 0; i < m; i++){scanf("%d%d%d%d%d",&a[i].u,&a[i].to,&a[i].w,&a[i].cnz,&a[i].jffzr);E[a[i].u].push_back({a[i].to,a[i].w-a[i].cnz});dep[a[i].to]++;}int ans1 = Topo();init();for(int i = 0; i < m; i++){E[a[i].u].push_back({a[i].to,a[i].w-a[i].jffzr});dep[a[i].to]++;}int ans2 = Topo();if(ans2 == ans1) printf("oof!!!\n");else if(ans2 > ans1) printf("cnznb!!!\n%d\n",ans2-ans1);else printf("rip!!!\n%d\n",ans1-ans2);}return 0;
}

AC代码2:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
const int maxm = 2e5+10;
struct DAG
{int n,tot;int head[maxn];int du[maxn]; //入度long long dis[maxn];struct Node{int to,next;long long d;}edge[maxm];void init(int nn){n = nn;memset(head,0,sizeof(head));memset(du,0,sizeof(du));memset(dis,0x3f,sizeof(dis));tot = 0;}void addedge(int u,int v,long long dd){edge[++tot].to = v;edge[tot].d = dd;edge[tot].next = head[u];head[u] = tot;du[v]++;}long long solve(){queue <int> Q;dis[1] = 0;for(int i = 1; i <= n; i++) if(du[i]==0) Q.push(i);while(!Q.empty()){int now = Q.front();Q.pop();for(int i = head[now]; i; i = edge[i].next){int to = edge[i].to;long long d = edge[i].d;dis[to] = min(dis[to],dis[now]+d);if(--du[to] == 0) Q.push(to);}  }return max(0ll, dis[n]);}
}A,B;
int main()
{int T,m,n,u,v;long long c,d,e;cin >> T;while(T--){scanf("%d%d",&n,&m);A.init(n); B.init(n);while(m--){scanf("%d%d%lld%lld%lld",&u,&v,&c,&d,&e);A.addedge(u, v, c - d);B.addedge(u, v, c - e);}long long ans1 = A.solve();long long ans2 = B.solve();if(ans2 == ans1) printf("oof!!!\n");else if(ans2 > ans1) printf("cnznb!!!\n%lld\n",ans2 - ans1);else printf("rip!!!\n%lld\n",ans1 - ans2);}return 0;
}

 

这篇关于牛客寒假算法基础集训营3-B-处女座的比赛资格(DAG上的最短路)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为