51nod1326 遙遠的旅途(spfa dp)

2021-08-20 13:50:47 字數 1307 閱讀 5315

題意:

給出乙個無向圖,問從1到n是否存在一條長度為l的路徑。

n,m<=50,1<=路徑長度<=10000,l<=10^18

思路:

改變一下思路,我們發現,假設從起點1走到終點n有一條路徑的長度為a,假設它再往一條與終點相連的長為b的路徑反覆走無數次後使得路徑長度到達了t,那麼一定有(t-a)%(2*k)==0,即**t%(2*k)=a%(2*k),所以我們只需要看是否從1到n存在一條路徑長度為d,使得d%(2*k)=t%(2*k)

因為這個題目和模數有關,所以我們要把取摸的結果寫入狀態.

dp[i][j]表示處於i節點,從一號點到i號點的花費和%(2*k)(選擇的邊權)等與k的最小花費.

那麼轉移就是:dp[to][(j+quan)%mod]=min(dp[now][j]+quan)

因為具有後效性,所以需要spfa.

//這道題較多的參考了晚上的解法,在看懂之後自己又寫了一遍

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn = 50 + 5, maxm = 2e4 + 5;

int n, m, num, head[maxn];

ll t, dp[maxn][maxm], inf = 2000000000000000000;

bool vis[maxn][maxm];

struct node edge[maxn * 2];

queue

int, int>>q;

void add_edge(int u, int v, int w)

void spfa(int mod)

}vis[x][y] = 0;

}}int main()

int flag = 0;

for (int i = 1; i <= num; i += 2)

if (edge[i].to == 1 || edge[i + 1].to == 1)

}dp[1][0] = 0;

spfa(w);

if (dp[n][t%w] <= t)

}if (!flag) printf("no\n");

}return

0;}

51nod1326 遙遠的旅途

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

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。那麼...