牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
2024-08-26 16:59:33
这个题,一眼看上去就是最短路的题,边权有负环显然不能用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;
}
最新文章
- WPF整理-为User Control添加依赖属性
- CSS3的透明度使用
- DSS中间件介绍
- HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
- [maven] pom.xml 文件详解
- struts使用html:file上传文件的时候文件名乱码解决
- JavaSE GUI显示列表 JTable的刷新 重新加载新的数据
- MAC 终端快捷建
- MyReport报表引擎2.0.0.0新功能
- centos7安装nagios步骤
- vue-父子组件嵌套的示例
- NVIDIA-SMI系列命令总结
- 一.从零认识XAML
- 一JavaScript获取当前月份的前12个月,获取最近的12个月二js实现获取当前月份前的12个月份,格式化后放在一个数组里
- 【bug记录】OS Lab3 踩坑记
- 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)
- mongodb 创建更新语法
- PC高级语言与施耐德、罗克韦尔、台达等PLC的Modbus通讯源代码(ModbusTCP.DLL/ModbusRTU.DLL)
- Windows 安装Redis程序
- 温习classList api
热门文章
- tyvj/joyoi 1374 火车进出栈问题(水水版)
- python的变量与注释
- anaconda的安装教程和使用方法
- error:crosses initialization of ...
- JMeter-Java压力测试工具-02
- 2018.11.26 QLU新生赛部分题解
- 数据库事务的隔离以及spring的事务传播机制
- 利用/dev/urandom文件创建随机数
- Tomcat 下载安装与配置
- Nginx+Keeplived双机热备(主从模式)