題意:
給出乙個無向圖,問從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。那麼...