NOIP模擬賽 長途旅行 最短路spfa)

2021-08-26 20:34:53 字數 2897 閱讀 9925

2023年11月3日3,0274

「題目描述」

jy是乙個愛旅遊的探險家,也是一名強迫症患者。現在jy想要在c國進行一次長途旅行,c國擁有n個城市(編號為0,1,2…,n – 1),城市之間有m條道路,可能某個城市到自己有一條道路,也有可能兩個城市之間有多條道路,通過每條道路都要花費一些時間。jy從0號城市開始出發,目的地為n – 1號城市。由於jy想要好好參觀一下c國,所以jy想要旅行恰好t小時。為了讓自己的旅行更有意思,jy決定不在任何乙個時刻停留(走一條到城市自己的路並不算停留)。jy想知道是否能夠花恰好t小時到達n – 1號城市(每個城市可經過多次)。現在這個問題交給了你。

若可以恰好到達輸出「possible」否則輸出「impossible」。(不含引號)。

「輸入格式」

第一行乙個正整數case,表示資料組數。

每組資料第一行3個整數,分別為n, m, t。

接下來m行,每行3個整數x, y, z,代表城市x和城市y之間有一條耗時為z的雙向邊。

「輸出格式」

對於每組資料輸出」possible」或者」impossible」.

「樣例輸入」

3 3 11

0 2 7

0 1 6

1 2 5

2 1 10000

1 0 1

「樣例輸出」

possible

impossible

「樣例解釋」

第一組:0 -> 1 -> 2 :11

第二組:顯然偶數時間都是不可能的。

「資料範圍」

30%: t <= 10000

另有30%: n <= 5 , m <= 10.

100%: 2 <= n <= 50 , 1 <= m <= 100 , 1 <= z <= 10000 , 1 <= t <= 10^18 , case <= 5.

時間非常大,存在乙個城市要經過很多次才能累加成t的情況,直接跑會超時。

如果存在一條連線0點的邊長度為d(不存在的話直接impossible),如果從0到n-1路徑長度為d,並且d+2*k*d = t,則possible

這樣原題就化為最短路問題了,dis[i][j] 代表到達i號點,時間為 j + p * 2d,最小的 j+p*2d。最後判斷dis[n -1][t % 2d] 是否小於等於t即可,取d為最小的d更優一些

我的**,不知道在**提交,並不保證對

#include typedef long long ll;

using namespace std;

const int inf = 1e18 + 5;

ll dis[55][200005],t;

bool vis[55][200005];

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}struct node1

edge[205];

int n;

int tot,head[55];

ll mod;

void init()

void addedge(int u,int v,ll w)

struct node2

node2(int _x,int _y)

};void spfa()

}memset(vis,0,sizeof(vis));

dis[0][0] = 0;

struct node2 temp;

temp.x = temp.y = 0;

queueq;

q.push(temp);

while(!q.empty()) }}

}}int main(void)

if(mod == 10000000)

mod *= 2;

spfa();

if(dis[n - 1][t % mod] <= t) printf("possible\n");

else printf("impossible\n");

}return 0;

}

其它部落格的乙個**

#include#include#include#include#include#include#include#define pa pair#define inf 1000000000

#define ll long long

using namespace std;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}ll t;

int n,m,cas,cnt,last[55],mod;

int q1[10000005],q2[10000005];

ll dis[55][20005];

struct datae[205];

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

bool spfa()

} }if(dis[n][t%mod]<=t)return 1;

return 0;

}int main()

if(mod==-1)puts("impossible");

else if(spfa())puts("possible");

else puts("impossible");

} return 0;

}

JZOJ 3890 長途旅行 同餘最短路

傳送門 給出一張圖,我們要在恰好為t tt的這個時間點到達n nn號城市,每個城市可以被經過多次 爽快跑一遍同餘最短路,至於mnmn mn的選取,我們就取與n nn號城市相連的權值最小的那條邊 之後如果dis n,t 2 m n t dis leq t disn,t 2 mn t就說明可以,否則就不...

10 12模擬賽 旅程 最短路

神即將帶領一些人去他們的孤寂之境,由於這個世界的不穩定,地點之間的有向道路會不定期地毀壞,出於工作準備,神想知道在某些道路毀壞之後某兩點之間的最短路。就是給定乙個有向圖,現有兩個操作,操作 1 是刪除一條邊 一條邊可重複刪除 操作 2是詢問兩個點之間的最短路。第 1 行兩個正整數 n,m,分別表示圖...

noip模擬賽 bzoj2932旅行

題解 話說這道題啊,是真的坑,正解不難,但是想歪是很簡單的,在常規的貪心不行的時候,本人就想到了dp,自我感覺 非常有道理,方程式也寫了出來,結果莫名wa了50 的資料,不懂,聽大牛說是因為不滿足最優子結構。表示 寫dp的時候從來沒有關注過這個東西 先說dp吧,dp i j 表示前i個人,有j個人在...