1. 程式人生 > >BZOJ-3890: [Usaco2015 Jan]Meeting Time (背包DP)

BZOJ-3890: [Usaco2015 Jan]Meeting Time (背包DP)

完全背包 log 會有 ble page solved esp printf color

無奈占坑……

這次坑填的倒是挺快的hhh

3890: [Usaco2015 Jan]Meeting Time

Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 321 Solved: 175
[Submit][Status][Discuss]

Description

Bessie和她的妹妹Elsie想要從谷倉旅行到他們最喜歡的地區去。她們會在同一時間離開谷倉,也希望要在同一時 間到達她們的目的地地區。農場由N個地區組成,分別編號為1..N (1 <= N <= 100),谷倉位於1號區域,而她們的 目的地是N號區域。由於農場是依山而建的,兩個區域之間會有高度差,編號小的地區海拔高於編號大的地區的海 拔,即1號地區海拔最高,N號地區海拔最低。會有M條小路兩兩連接不同地區。因為山路過於陡峭,路只允許以下 坡的方式行走。比如就一條路連接了5號區域和8號區域,那麽只允許從5號區域前往8號區域而不允許反向行走。每 兩個地區之間至多只有一條路,所以M <= N(N-1)/2。Bessie和Elsie走路所花費的時間是不一樣的。比如,走同一 條路,Bessie會需要10個單位時間,而Elsie會要20個。請註意,因為她們在趕時間,所以只會在路上花費時間, 進入或者離開一個區域不需要花費時間,而且她們也不會停下來等對方。請幫忙計算出Bessie和Elsie最短需要多 少時間才能同時出發且同時到達她們的目的地。

Input

第一行包含兩個以空格分隔的整數,分別為N和M。 接下來M行描述連接區域之間的路的情況 每一行給出四個以空格分隔的整數A B C D,表示A區域和B區域之間有一條路, Bessie需要C個單位時間來走完這條路,而Elsie需要D個單位時間來走。 C和D都在區間1..100內。

Output

輸出一個整數。即Bessie和Elsie同時出發且同時達到N號區域所需要的最少時間。 如果無法到達N號區域或者不可能同時到達,請輸出單詞 "IMPOSSIBLE"(引號不用輸出)。

Sample Input

3 3
1 3 1 2
1 2 1 2
2 3 1 2

Sample Output

2
SOLUTION NOTES:
Bessie is twice as fast as Elsie on each path, but if Bessie takes the
path 1->2->3 and Elsie takes the path 1->3 they will arrive at the
same time.

HINT

Source

Silver

這題本來想練習拓撲排序的……可是貌似看到有大佬用完全背包把尬過去了???Orz laj還是太辣雞了……

竟然交了兩次……沒看到IMPOSSIBLE直接輸出-1了mmp

 1
#include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=105; 5 int n,m; 6 int tot,head[MAX],adj[MAX*MAX],next[MAX*MAX],wei[MAX*MAX][2]; 7 int f[MAX][10005],g[MAX][10005]; 8 inline int read(){ 9 int an=0,x=1;char c=getchar(); 10 while (c<0 || c>9) {if (c==-) x=-1;c=getchar();} 11 while (c>=0 && c<=9) {an=an*10+c-0;c=getchar();} 12 return an*x; 13 } 14 void addedge(int u,int v,int w1,int w2){ 15 tot++; 16 adj[tot]=v; 17 wei[tot][1]=w1,wei[tot][2]=w2; 18 next[tot]=head[u]; 19 head[u]=tot; 20 } 21 int main(){ 22 freopen ("time.in","r",stdin);freopen ("time.out","w",stdout); 23 int i,j,k; 24 int u,v,w1,w2; 25 n=read(),m=read(); 26 for (i=1;i<=m;i++){ 27 u=read(),v=read(),w1=read(),w2=read(); 28 addedge(u,v,w1,w2); 29 } 30 memset(f,false,sizeof(f)),memset(g,false,sizeof(g)); 31 f[1][0]=g[1][0]=true; 32 for (i=1;i<n;i++){ 33 for (j=head[i];j;j=next[j]){ 34 for (k=wei[j][1];k<=10000;k++) f[adj[j]][k]|=f[i][k-wei[j][1]]; 35 for (k=wei[j][2];k<=10000;k++) g[adj[j]][k]|=g[i][k-wei[j][2]]; 36 } 37 } 38 for (i=1;i<=10000;i++) 39 if (f[n][i] && g[n][i]) 40 return printf("%d",i),0; 41 puts("IMPOSSIBLE"); 42 return 0; 43 }

BZOJ-3890: [Usaco2015 Jan]Meeting Time (背包DP)