zoukankan      html  css  js  c++  java
  • 新三国争霸

                                                              新三国争霸

    题目描述

    • PP特别喜欢玩即时战略类游戏,但他觉得那些游戏都有美中不足的地方。灾害总不降临道路,而只降临城市,而且道路不能被占领,没有保护粮草的真实性。于是他就研发了《新三国争霸》。
    • 在这款游戏中,加入灾害对道路的影响(也就是一旦道路Wi,j受到了灾害的影响,那么在一定时间内,这条路将不能通过)和道路的占领权(对于一条道路Wi,j,至少需要Ki,j个士兵才能守住)。
    • PP可真是高手,不一会,就攻下了N-1座城市,加上原来的就有N座城市了,但他忽略了一点……那就是防守同样重要,不过现在还来的及。因为才打完仗,所以很多城市都需要建设, 估算了一下,大概需要 天。他现在无暇分身进攻了,只好在这T天内好好的搞建设了。所以他要派士兵占领一些道路,以确保任何两个城市之间都有路(不然敌人就要分而攻之了,是很危险的)。
    • 士兵可不是白干活的,每个士兵每天都要吃掉V的军粮。因为有灾害,所以方案可能有变化(每改变一次就需要K的军粮,初始方案也需要K的军粮)。
    • 因为游戏是PP编的,所以他知道什么时候有灾害。 可是一个很节约的人,他希望T天在道路的防守上花最少的军粮。

    输入格式

    • 第一行有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 ,T1,T2。表示X到Y的这条路,在T1到T2这几天都会受灾害。

    输出格式

     T天在道路的防守上花费最少的军粮。

    样例

    样例输入

    3 3 5 10 30
    1 2 1
    2 3 2
    1 3 4
    1
    1 3 2 5
    

    样例输出

    180
    

    数据范围与提示

    N<=300,M<=5000,T<=50,保证结果不超过231-1.

    思路:此题可理解为选边权最小的一些路,使任何两点之间相连,有些边在特定时刻不能选,是不是有些像最小生成树,所以我们可以用dp解用最小生成树维护每一段时间所需最少军粮,差不多维护n2个最小生成树,预处理出每个时间段所需士兵,进而求出军粮。用dp转移即可,转移方程:f[i]=min(f[i],f[j]+w[i-1][j]*v*(i-j)+k);

     1 #include<cstdio>
     2 #include<utility>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 const int maxn=300+10,maxm=5000+10,inf=0x3f3f3f3f;
     7 int z[55][maxn][maxn],w[55][55],f[55];
     8 int fa[maxn];
     9 int n,m,t,v,k;
    10 struct Edge{
    11     int u,v,w;
    12 }e[maxm];
    13 bool Cmp(Edge a,Edge b){
    14     return a.w<b.w;
    15 }
    16 int Find_root(int x){
    17     return fa[x]==x?x:(fa[x]=Find_root(fa[x]));
    18 }
    19 bool check(int u,int v,int t1,int t2){
    20     for(int i=t1;i<=t2;i++) if(z[i][u][v]) return 0;
    21     return 1;
    22 }
    23 int work(int t1,int t2){
    24     for(int i=1;i<=n;i++) fa[i]=i;
    25     int ans=0;
    26     int cnt=0;
    27     for(int i=1;i<=m;i++){
    28         int u=e[i].u;
    29         int v=e[i].v;
    30         if(check(u,v,t1,t2)){
    31             int fu=Find_root(u);
    32             int fv=Find_root(v);
    33             if(fu!=fv){
    34                 fa[fv]=fu;
    35                 ans+=e[i].w;
    36                 cnt++;
    37                 if(cnt==n-1) return ans;
    38             }
    39         }
    40     }
    41     return inf;
    42 }
    43 void Init(){
    44     for(int i=1;i<=t;i++){
    45         for(int j=i;j<=t;j++){
    46             w[i][j]=work(i,j);
    47         }
    48     }
    49 }
    50 int main(){
    51     scanf("%d%d%d%d%d",&n,&m,&t,&v,&k);
    52     for(int i=1;i<=m;i++){
    53         scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    54         if(e[i].u>e[i].v) swap(e[i].u,e[i].v);
    55     }
    56     sort(e+1,e+1+m,Cmp);
    57     int p;
    58     scanf("%d",&p);
    59     for(int i=1;i<=p;i++){
    60         int x,y,t1,t2;
    61         scanf("%d%d%d%d",&x,&y,&t1,&t2);
    62         if(x>y) swap(x,y);
    63         if(t1>t2) swap(t1,t2);//x,y要注意将小的放在前面
    64         for(int j=t1;j<=t2;j++) z[j][x][y]=1;//标记x到y这条边在那个时间点被破坏
    65     }                                        //不能直接记录每条边被破坏的起止时间,因为一条边可能在多个不相邻的时间被破坏
    66     Init();//最小生成树预处理
    67     memset(f,0x3f,sizeof(f));
    68     for(int i=1;i<=t;i++){
    69         if(w[1][i]!=inf) f[i]=w[1][i]*v*i+k;//注意判断w[i][j]!=inf,不然会爆掉
    70         for(int j=1;j<i;j++){
    71             if(w[j+1][i]!=inf) f[i]=min(f[i],f[j]+k+w[j+1][i]*v*(i-j));
    72         }
    73     }
    74     printf("%d
    ",f[t]);
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/HZOIDJ123/p/13393718.html
Copyright © 2011-2022 走看看