某一天,少年邂逅了同病相連的ia。見面後,ia一把牽起少年的手,決定和他一起逃離部落,離開這個無法容身的是非之地。
要逃離部落,少年和ia就需要先選擇一條耗時最少的路線,從而避免被部落的大人們抓到。部落可以大致分為n個區域,少年和ia在區域1,部落的出口設在區域n。此外部落還有m條連線兩個區域道路。道路是無向的,沒有一條道路的兩端連線相同的區域,也沒有兩條道路所連線的兩個區域完全相同。對於其中前(m−1)條道路,其通過時間是確定的,但最後一條道路,由於地理因素,通過其的時間會不斷變化。
現在,少年和ia得知了在k個不同的時段裡,通過第m條道路的時間,請您分別計算出在這k 個時段中逃離部落的最少時間,以幫助他們確定行動的時刻。
第一行三個整數n,m,k,分別表示區域數,道路數,詢問數。
接下來m−1行每行三個整數ui,vi,wi(ui≠vi,1≤ui,vi≤n,0輸出共計k行,每行乙個整數,表示對應時段逃離部落的最短時間。如果在該時段內無法逃離,輸出「+inf」。
方法一:從1和n開始分別跑一邊最短路,那麼對於最後一條邊(x,y)答案就為min( dis[1~n],dis[1~x]+z+dis[y~n] ,dis[1~y]+len+dis[x~n] )
方法二:從1開始到n跑一邊最短路,最小的路徑有兩種可能,1~n不經過len這條邊,1~n經過len這條邊,兩個分開存,更新時,它們可以分別更新自己,其次,不經過最後一天邊的可以通過最後一條邊更新到經過這條邊的最短路,那麼最後的答案就是min(dis[ 不經過最後一條邊 ][1~n] ,dis[經過最後一條邊][1~n]+len )。
注意最後乙個資料點的範圍不是最大的,其次spfa要用隊首隊尾玄學優化。
#include#include#include#define i int
#define ll long long
#define f(i,a,b) for(register i i=a;i<=b;++i)
#define fd(i,a,b) for(register i i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof a)
#define n 200010
#define m 500000
using namespace std;
i n,m,k,x,y,z,i,j,bz[n],d[n<<3],t[m<<1],nx[m<<1],l[n],s[m<<1],tot;
ll f[2][n],inf;
void rd(i &x)
}void a(i x,i y,i z)
void spfa(i z,i s)
} }}i main()
spfa(0,1);
spfa(1,n);
rd(x),rd(y);
while(k--)
}void a(i x,i y,i z)
i main()
rd(x),rd(y);
a(x,y,0),a(y,x,0);
f(i,2,n) f[0][i]=f[1][i]=1ll<<62;
inf=f[d[1]=1][2];
i i=1,j=1;
while(i<=j)
}if(!s[k])
}} }
while(k--)
else printf("+inf\n");
} return 0;
}
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOI(P)2013模擬 秘密任務
這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...
NOIP2013模擬 粉刷匠
給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...