51nod1326 遙遠的旅途

2021-07-25 11:54:07 字數 1271 閱讀 2937

一張有n個點,m條變的無向圖,每條邊有邊權。

在0時刻有乙個人在點1,每一次他走過一條邊,消耗的時間為這條邊的邊權,而不能停留在原地。

現在他想知道是否存在一種方案使得他在t時刻剛好到達點n。

多組資料,case<=3,2<=n<=50,1<=m<=50,1<=t<=10^18

上上週做gdoi組時worldwide_d說這道題是t2原題,於是就被強行安利來搞這道題了。。。

發現真的是完全揹包問題的加強版~~不過思路是一樣的。

先列舉一條到n的邊,我們要判斷有沒有一種方案,使得可以走到n之後,一直走這條邊直到時刻t。

那麼我們設這條邊邊權為w,fi,j表示到點i時刻%(2*w)為j的最小的時刻。

那麼轉移顯然,不過會出現環,那麼就把每個狀態看做乙個點,跑一遍spfa就好了。

然後判斷狀態fn,t%(2*w)是否小於t就好了。

小於t就表示這是個可行方案,不行的話還要繼續列舉。。。

設總共有k個狀態,時間複雜度理論o(nk^2)(玄學spfa)

加乙個玄學剪枝優化就過了。。。(反正你去寫dijkstra也沒問題,複雜度***呵)

#include 

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define rep(i,a) for(int i=last[a];i;i=next[i])

using namespace std;

typedef long long ll;

const int n=1e6+5;

ll dis[n],t;

int n,m,l,ty,x[n],y[n],z[n],d[n*10];

int t[n*2],next[n*2],v[n*2],last[n];

bool bz[n];

ll read()

int get(int

x,int

y,int z)

void add(int

x,int

y,int z)

void link(int w)

}void spfa()

}bz[d[i]]=0;

}}int main()

}if (pd) printf("possible\n");

else

printf("impossible\n");

}}

51nod1326 遙遠的旅途

給你乙個n個點m條邊的無向圖,每條邊有正整數的邊權,問是否存在一條0到n 1的長度為t的路徑 點和邊可以重複 n,m 50 邊權不超過10000 t 1018 資料組數不超過3 這道題有點考思維啊!考慮這樣的一條路徑。如果不是簡單路徑,它可能會包括若干個環。如果我確定了乙個必須走的環,假設它的長度為...

51 Nod 1326 遙遠的旅途

例如樣例中小鹿的行程可以是0 1 2 0 2.這題長得很像乙個完全揹包,但是是在乙個圖上面的。因為一條邊很可能會重複走,那麼連向n的邊肯定有一條至少走一次,所以與n相連的邊的重複可能性最大。其他有重複也沒有關係,下面會講 我們考慮在走到n之後,然後在與n連線的一條邊上不斷地折返,最後時間到達t。那麼...

51Nod 1326 遙遠的旅途

解題報告 用時 1h30min,1tle 這題首先要明白,到終點至少要經過一條n的出邊,所以如果可行,一定是將某一條出邊走很多次,然後再到達終點,即 2 w j t 所以只要 j t mod2 w 存在即可,所以我們列舉每一條出邊,然後跑spfa 看 f n j 是否存在即可,我們定義 f i j ...