51nod1326 遙遠的旅途

2021-07-25 05:38:56 字數 1061 閱讀 3608

給你乙個n個點m條邊的無向圖,每條邊有正整數的邊權,問是否存在一條0到n-1的長度為t的路徑(點和邊可以重複)。

n,m≤50 邊權不超過10000 t≤

1018

資料組數不超過3

這道題有點考思維啊!

考慮這樣的一條路徑。如果不是簡單路徑,它可能會包括若干個環。

如果我確定了乙個必須走的環,假設它的長度為len,那麼可以這樣設狀態:

f[i][j][0/1]表示:走到了i這個點,路徑的長度模len等於j,0/1表示我是否走過這個環。f[i][j][k]記錄的是滿足i,j,k的最短路徑長度。然後答案就是判斷f[n-1][t%len][1]是否小於等於t。

證明上面的演算法的正確性:假設我在路徑上有另乙個環,那麼假設第一次走進這個環是路徑長度模len為j,走這個環若干次後,第二維狀態一定會回到j。多個環也類似。

所以剩下的就是列舉可能的環了。發現單獨一條邊也可以構造出乙個環,而且邊權不是很大,所以可以考慮列舉所有邊。同時,修改第三維01狀態表示這條邊是否經過(即不一定要走環),正確性沒有變。這樣就可以通過所有資料了。

#include 

#include

#include

using namespace std;

const int n=55,m=20005;

typedef long long ll;

ll len,f[n][m][2];

int case,n,m,h[n],e[n*2],nxt[n*2],e[n][3],tot,d[n*2],data[n*m][3];

bool v[n][m][2];

void add(int x,int y,int len)

bool check(int p)}}

v[x][y][z]=0;

}return f[n-1][len%mo][1]<=len;

}void work()

for (int i=0;iif (check(i))

printf("impossible\n");

}int main()

51nod1326 遙遠的旅途

一張有n個點,m條變的無向圖,每條邊有邊權。在0時刻有乙個人在點1,每一次他走過一條邊,消耗的時間為這條邊的邊權,而不能停留在原地。現在他想知道是否存在一種方案使得他在t時刻剛好到達點n。多組資料,case 3,2 n 50,1 m 50,1 t 10 18 上上週做gdoi組時worldwide ...

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 ...