CODEVS1403 新三國爭霸

來源:互聯網
上載者:User

標籤:遊戲   sign   整數   namespace   signed   cpp   operator   smi   check   

題目描述Description

PP 特別喜歡玩即時戰略類遊戲,但他覺得那些遊戲都有美中不足的地方。災害總不降臨道路,而只降臨城市,而且道路不能被佔領,沒有保護糧草的真實性。於是他就研發了《新三國爭霸》。
在這款遊戲中,加入災害對道路的影響(也就是一旦道路W[i,j]受到了災害的影響,那麼在一定時間內,這條路將不能通過)和道路的佔領權(對於一條道路W[i,j],至少需要K[i,j]個士兵才能守住)。
PP可真是高手,不一會,就攻下了N-1座城市,加上原來的就有N座城市了,但他忽略了一點……那就是防守同樣重要,不過現在還來的及。因為才打完仗所以很多城市都需要建設,PP估算了一下,大概需要T天。他現在無暇分身進攻了,只好在這T天內好好的搞建設了。所以他秒要派士兵佔領一些道路,以確保任何兩個城市之間都有路(不然敵人就要分而攻之了,是很危險的)。士兵可不是白乾活的,每個士兵每天都要吃掉V的軍糧。因為有災害,所以方案可能有變化(每改變一次就需要K的軍糧,初始方案也需要K的軍糧)。
因為遊戲是PP編的,所以他知道什麼時候有災害。PP可是一個很節約的人,他希望這T天在道路的防守上花最少的軍糧。
\(N\leq300\),\(M\leq5000\) ,\(T\leq50\)

輸入描述Input Description

第一行有5個整數\(N\),\(M\),\(T\),\(V\),\(K\)。\(N\)表示有城市數,\(M\)表示道路數,\(T\)表示需要修養的天數,\(V\)表示每個士兵每天吃掉的軍糧數,\(K\)表示修改一次花掉的軍糧數。
以下M行,每行3個數\(A\),\(B\),\(C\)。表示\(A\)與\(B\)有一條路(路是雙向的)需要\(C\)個士兵才能守住。
第\(M+2\)行是一個數P,表示有\(P\)個災害。
以下P行,每行4個數\(X\),\(Y\),\(T_1\),\(T_2\)。表示X到Y的這條路,在\(T_1\)到\(T_2\)這幾天都會受災害。

輸出描述Output Description

\(T\)天在道路的防守上花費最少的軍糧。

範例輸入Sample Input
3 3 5 10 301 2 12 3 21 3 411 3 2 5
範例輸出Sample Output
180
資料範圍及提示Data Size & Hint

各個測試點\(1s\)

Solution

emmmm沒什麼好說的。

像這種,可以保持一段時間狀態不變的東西基本上都可以DP。今天不知道腦子壞成了什麼樣子,這麼裸的題目想了好半天。

然後用Kruskal預先處理出來從\(i\)天到\(j\)天用同一種狀態的最小代價\(w[i][j]\)。然後直接暴力轉移。令\(dp[i]\)表示到第\(i\)天的最小代價。

\[dp[i]=min\{dp[j]+w[j+1][i]\times V*(i-j)+K|0\leq j<i\}\]

#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;#define lowbit(x) ((x)&(-(x)))#define REP(i,a,n) for(register int i=(a);i<=(n);++i)#define PER(i,a,n) for(register int i=(a);i>=(n);--i)#define FEC(i,x) for(register int i=head[x];i;i=g[i].ne)#define dbg(...) fprintf(stderr,__VA_ARGS__)namespace io{    const int SIZE=(1<<21)+1;char ibuf[SIZE],*iS,*iT,obuf[SIZE],*oS=obuf,*oT=oS+SIZE-1,c,qu[55];int f,qr;    #define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)    inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}    inline void putc(char x){*oS++=x;if(oS==oT)flush();}    template<class I>inline void read(I &x){for(f=1,c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=gc())x=x*10+(c&15);x*=f;}    template<class I>inline void write(I x){if(!x)putc('0');if(x<0)putc('-'),x=-x;while(x)qu[++qr]=x%10+'0',x/=10;while(qr)putc(qu[qr--]);}    struct Flusher_{~Flusher_(){flush();}}io_flusher_;}//orz laofudasuanusing io::read;using io::putc;using io::write;typedef long long ll;typedef unsigned long long ull;template<typename A,typename B>inline bool SMAX(A&x,const B&y){return y>x?x=y,1:0;}template<typename A,typename B>inline bool SMIN(A&x,const B&y){return y<x?x=y,1:0;}const int N=300+7,M=5000+7,T=50+7,INF=0x3f3f3f3f;int n,m,t,V,K,p,x,y,t1,t2,fbd[T][N][N],dp[T],w[N][N];struct Edge{int x,y,z;inline bool operator<(const Edge&a)const{return z<a.z;}}G[M];int fa[N];inline int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}inline void Union(int x,int y){x=Find(x),y=Find(y);fa[y]=x;}inline bool Check(int a,int b,int l,int r){for(register int i=l;i<=r;++i)if(fbd[i][a][b])return 1;return 0;}inline int Kruskal(int l,int r){    for(register int i=1;i<=n;++i)fa[i]=i;int ans=0;    for(register int i=1,cnt=0;i<=m;++i){        int x=G[i].x,y=G[i].y,z=G[i].z;if(Find(x)==Find(y)||Check(x,y,l,r))continue;        Union(x,y);++cnt;ans+=z;if(cnt==n-1)return ans;    }    return ans;}inline void DP(){    dp[0]=0;    for(register int i=1;i<=t;++i){        dp[i]=INF;        for(register int j=0;j<i;++j)            SMIN(dp[i],dp[j]+w[j+1][i]*V*(i-j)+K);    }}int main(){#ifndef ONLINE_JUDGE    freopen("CV1403.in","r",stdin);freopen("CV1403.out","w",stdout);#endif    read(n),read(m),read(t),read(V),read(K);    for(register int i=1;i<=m;++i)read(G[i].x),read(G[i].y),read(G[i].z);sort(G+1,G+m+1);    read(p);for(register int i=1;i<=p;++i){read(x),read(y),read(t1),read(t2);for(register int j=t1;j<=t2;++j)fbd[j][x][y]=fbd[j][y][x]=1;}    for(register int i=1;i<=t;++i)for(register int j=i;j<=t;++j)w[i][j]=Kruskal(i,j);    DP();write(dp[t]),putc('\n');//錯誤筆記:注意輸出的是dp[t]!!! }

CODEVS1403 新三國爭霸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.