题目链接

这个题,一眼看上去就是最短路的题,边权有负环显然不能用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;
}

最新文章

  1. WPF整理-为User Control添加依赖属性
  2. CSS3的透明度使用
  3. DSS中间件介绍
  4. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
  5. [maven] pom.xml 文件详解
  6. struts使用html:file上传文件的时候文件名乱码解决
  7. JavaSE GUI显示列表 JTable的刷新 重新加载新的数据
  8. MAC 终端快捷建
  9. MyReport报表引擎2.0.0.0新功能
  10. centos7安装nagios步骤
  11. vue-父子组件嵌套的示例
  12. NVIDIA-SMI系列命令总结
  13. 一.从零认识XAML
  14. 一JavaScript获取当前月份的前12个月,获取最近的12个月二js实现获取当前月份前的12个月份,格式化后放在一个数组里
  15. 【bug记录】OS Lab3 踩坑记
  16. 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)
  17. mongodb 创建更新语法
  18. PC高级语言与施耐德、罗克韦尔、台达等PLC的Modbus通讯源代码(ModbusTCP.DLL/ModbusRTU.DLL)
  19. Windows 安装Redis程序
  20. 温习classList api

热门文章

  1. tyvj/joyoi 1374 火车进出栈问题(水水版)
  2. python的变量与注释
  3. anaconda的安装教程和使用方法
  4. error:crosses initialization of ...
  5. JMeter-Java压力测试工具-02
  6. 2018.11.26 QLU新生赛部分题解
  7. 数据库事务的隔离以及spring的事务传播机制
  8. 利用/dev/urandom文件创建随机数
  9. Tomcat 下载安装与配置
  10. Nginx+Keeplived双机热备(主从模式)