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個人在...