給你乙個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 ...