一張有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 ...