洛谷P2136 拉近距離(負環判定)

2022-05-27 01:39:14 字數 1437 閱讀 4105

我是源點,你是終點。我們之間有負權環。 ——小明

在小明和小紅的生活中,有 nnn 個關鍵的節點。有 mmm 個事件,記為乙個三元組 (si,ti,wi)(s_i,t_i,w_i)(si​,ti​,wi​),表示從節點 sis_isi​有乙個事件可以轉移到 tit_iti​,事件的效果就是使他們之間的距離減少 wiw_iwi​。

這些節點構成了乙個網路,其中節點 111 和 nnn 是特殊的,節點 111 代表小明,節點 nnn 代表小紅,其他代表進展的階段。所有事件可以自由選擇是否進行,但每次只能進行當前節點鄰接的。請你幫他們寫乙個程式,計算出他們之間可能的最短距離。

第一行,兩個正整數 n,mn,mn,m。

之後 mmm 行,每行 333 個空格隔開的整數 si,ti,wis_i,t_i,w_isi​,ti​,wi​。

一行,乙個整數表示他們之間可能的最短距離。如果這個距離可以無限縮小,輸出forever love

輸入 #1複製

3 3

1 2 3

2 3 -1

3 1 -10

輸出 #1複製

-2

由於是減少,所以要存負邊,轉化為負環判定+最短路問題。注意:有可能是小明找小紅也可能是小紅找小明!

所以整個流程是:小明為起點spfa->有負環直接輸出,無負環更新答案(取最小)->小紅為起點spfa->有負環直接輸出,無負環更新答案->輸出答案

#include #define n 1005

#define m 10005

using

namespace

std;

int n,m,tot=0

;int head[n],edge[2*m],ver[2*m],next[2*m],cnt[n],d[n];

bool

v[n];

void add(int x,int y,int

z)bool spfa(int

num)}}

return0;

}int

main()

int ans=0x3f3f3f3f

;

bool flag1=spfa(1

);

if(flag1)

ans=d[n];

memset(cnt,

0,sizeof

(cnt));

memset(v,

0,sizeof

(v));

memset(d,

0x3f,sizeof

(d));

bool falg2=spfa(n);

if(flag1)

ans=min(ans,d[1

]); cout

}

洛谷 P2136 拉近距離

我是源點,你是終點。我們之間有負權環。小明 在小明和小紅的生活中,有n個關鍵的節點。有m個事件,記為乙個三元組 si,ti,wi 表示從節點si有乙個事件可以轉移到ti,事件的效果就是使他們之間的距離減少wi。這些節點構成了乙個網路,其中節點1和n是特殊的,節點1代表小明,節點n代表小紅,其他代表進...

P2136 拉近距離

我也想有這樣的愛情故事,可惜我單身 其實這道題就是乙個比較裸的最短路問題。對於乙個三元組 s,w,t s其實就是乙個端點,而w就是到達的端點,連線兩個端點的邊長為 t,注意要取乙個相反數,這樣才能繼續跑最短路 那麼題意也就這麼看完了,就是很簡單的跑最短路嘛,小明是起點,小紅是終點,小明追小紅就完事了...

洛谷 2136 拉近距離

我是源點,你是終點。我們之間有負權環。小明 在小明和小紅的生活中,有n個關鍵的節點。有m個事件,記為乙個三元組 si,ti,wi 表示從節點si有乙個事件可以轉移到ti,事件的效果就是使他們之間的距離減少wi。這些節點構成了乙個網路,其中節點1和n是特殊的,節點1代表小明,節點n代表小紅,其他代表進...