牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
这个题,一眼看上去就是最短路的题,边权有负环显然不能用dij,然后出题人又卡了spfa,,那怎么办的想点办法啊,好像还有一个拓扑排序可以求最短路吧,这时候正解就已经得到了,就是拓扑排序求最短路。
在求拓扑序的时候,每次入队时,将这个入队的点所拓展出来的点都进行松弛操作,就可以啦,复杂度O(E+V),后面的判断还要注意一下。就做完啦。
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <bitset>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define MAXN 1010100
#define LL long long
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll __int64
#define INF 0x7fffffff
#define cs(s) freopen(s,"r",stdin)
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#define eps 1e-10
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/gcd(a,b)*b;}
LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
//head
vector<pair<int,pair<LL,pair<LL,LL> > > >v[100001];
LL disa[100001],disb[100001];
int inq[100001];
int du[100001],dd[100001];
int main(){
ios::sync_with_stdio(false);
int tt;
for(cin>>tt;tt;tt--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)v[i].clear(),disa[i]=1e18,disb[i]=1e18,inq[i]=du[i]=dd[i]=0;
disa[1]=disb[1]=0;
for(int i=1;i<=m;i++){
int s,t;
LL c,cb,jff;
cin>>s>>t>>c>>cb>>jff;
v[s].pb({t,{c,{-cb,-jff}}});
du[t]++;
dd[t]++;
}
queue<int>p,q;
while(!p.empty())p.pop();
while(!q.empty())q.pop();
for(int i=1;i<=n;i++){
if(!du[i]){
p.push(i);
for(auto k:v[i]){
if(disa[k.fi]>disa[i]+k.se.fi+k.se.se.fi){
disa[k.fi]=disa[i]+k.se.fi+k.se.se.fi;
}
}
}
if(!dd[i]){
q.push(i);
for(auto k:v[i]){
if(disb[k.fi]>disb[i]+k.se.fi+k.se.se.se){
disb[k.fi]=disb[i]+k.se.fi+k.se.se.se;
//cout<<k.fi<<' '<<disb[k.fi]<<endl;
}
}
}
}
while(!p.empty()){
int now=p.front();
p.pop();
for(auto k:v[now]){
--du[k.fi];
if(!du[k.fi]){
p.push(k.fi);
for(auto kk:v[k.fi]){
if(disa[kk.fi]>disa[k.fi]+kk.se.fi+kk.se.se.fi){
disa[kk.fi]=disa[k.fi]+kk.se.fi+kk.se.se.fi;
}
}
}
}
}
while(!q.empty()){
int now=q.front();
q.pop();
for(auto k:v[now]){
--dd[k.fi];
if(!dd[k.fi]){
q.push(k.fi);
for(auto kk:v[k.fi]){
if(disb[kk.fi]>disb[k.fi]+kk.se.fi+kk.se.se.se){
disb[kk.fi]=disb[k.fi]+kk.se.fi+kk.se.se.se;
}
}
}
}
}
swap(disa[n],disb[n]);
disa[n]=max(disa[n],0ll);
if(disa[n]==0&&disb[n]<=0){
cout<<"oof!!!\n";
}else {
if(disb[n]<=0){
cout<<"cnznb!!!\n";
cout<<disa[n]<<endl;
}else{
if(disb[n]>disa[n]){
cout<<"rip!!!\n";
cout<<disb[n]-disa[n]<<endl;
}else{
cout<<"cnznb!!!\n";
cout<<disa[n]-disb[n]<<endl;
}
}
}
}
return 0;
}
牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)的更多相关文章
- 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)
链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客寒假训练营2-C算概率
思路 用 f(i,j) 来表示当前做了i道题,共做对了j道题 状态 f[i][j] = f[i-1][j] * (1-p[i]) + f[i-1][j-1] * p[i] 第一种:由于i-1时对了j题 ...
- 牛客寒假训练营2-H施魔法
思路 dp去维护前缀f[i-1] - ai的最小值 CODE #include <bits/stdc++.h> #define dbg(x) cout << #x <&l ...
- honoka和格点三角形(牛客寒假训练营day1)
可以把面积为1的好三角形分成两类分开统计:两条边和两个坐标轴平行:只有一条边和某个坐标轴平行. 对于第一种情况,一定是1*2或者2*1的形式,一个1*2的矩形中含有4个不同的三角形.总数是4*((n- ...
- 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】
链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...
- 2020牛客寒假算法基础集训营2 J题可以回顾回顾
2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...
- 2020牛客寒假算法基础集训营1 J题可以回顾回顾
2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...
- 牛客寒假算法基础集训营3处女座和小姐姐(三) (数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 欧拉函数-gcd-快速幂(牛客寒假算法基础集训营1-D-小a与黄金街道)
题目描述: 链接:https://ac.nowcoder.com/acm/contest/317/D来源:牛客网小a和小b来到了一条布满了黄金的街道上.它们想要带几块黄金回去,然而这里的城管担心他们拿 ...
随机推荐
- 百度地图API示例:使用vue添加删除覆盖物
1.index.html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2. ...
- increment/decrement/dereference操作符
标题以上分别对于++/--/* #include <iostream> #include <cstddef> using namespace std; class INT { ...
- 安装SVN并使用IDEA检出项目
首先去下载小王八:https://tortoisesvn.net/downloads.html 下载完毕,打开 .. ..注意勾选command line工具 .. .. 下一步,打开IDEA,配置S ...
- python: 反射机制;
import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...
- angular 中自己常用的下拉框获取值方法
方法一 HTML页中 <select name="" id="if02" data-first-option="true" (chan ...
- 神经网络4_BP神经网络
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- 信用评分卡 (part 1 of 7)
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- C++ 容器之 list的使用
1.List 装入引用或指针的方式 push_back() push_front() pop_back() pop_front() #include <iostream> #include ...
- 打包JAR,MANIFEST.MF格式
MANIFEST.MF文件格式详解 1. 基本格式 属性名称+:+空格+属性值 2. 没行最多72个字符,换行继续必须以空格开头 3. 文件最后必须要有一个回车换行 4. Class-Path 当前路 ...
- C++回顾day02---<拷贝构造函数:重点>
一:补充---无参构造函数(默认无参构造函数)在实例化对象时注意点 (一)若没有写构造函数,则类会含有一个默认无参构造函数 (二)若自定义一个构造函数,则类不会提供默认构造函数 class A { p ...