zoukankan      html  css  js  c++  java
  • Lightoj 1174

    题目链接:

      Lightoj  1174 - Commandos

    题目描述:
      有一军队秉承做就要做到最好的口号,准备去破坏敌人的军营。他们计划要在敌人的每一个军营里都放置一个炸弹。军营里有充足的士兵,每个士兵都可以携带充足的炸弹,问这个军队完成任务最少需要时间?(假设士兵在往敌军帐篷里放炸弹时,敌军不会防御。敌人是猪嘛?这是在和猪战斗嘛?

    解题思路:
      水题,求士兵完成任务的最短时间,也就是说每个士兵执行任务的时候只能选择最优路径咯。但是又要满足每个点都要被走过,所以就要求出能覆盖所有点的最短路径里最长一条的长度咯。只需要从起点bfs一遍所有的点,然后从终点bfs一遍所有的点。辣么从起点到终点并且经过x的最短路径长度就是两次bfs出来的结果和咯。

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int maxn = 105;
     8 struct node
     9 {
    10     int to, next;
    11 }edge[maxn*maxn];
    12 int head[maxn], tot, a[maxn], b[maxn];
    13 
    14 void Add (int from, int to)
    15 {
    16     edge[tot].to = to;
    17     edge[tot].next = head[from];
    18     head[from] = tot ++;
    19 }
    20 
    21 void bfs (int s, int vis[])
    22 {
    23     queue <int> Q;
    24     Q.push(s);
    25     vis[s] = 0;
    26     while (!Q.empty())
    27     {
    28         int u = Q.front();
    29         Q.pop();
    30         for (int i=head[u]; i!=-1; i=edge[i].next)
    31         {
    32             int v = edge[i].to;
    33             if (vis[v]==-1)
    34             {
    35                 vis[v] = vis[u] + 1;
    36                 Q.push (v);
    37             }
    38         }
    39     }
    40 }
    41 
    42 int main ()
    43 {
    44     int t, n, r, s, e, cas = 1;
    45     scanf ("%d", &t);
    46 
    47     while (t --)
    48     {
    49         scanf ("%d %d", &n, &r);
    50         memset (head, -1, sizeof(head));
    51         tot = 0;
    52 
    53         for (int i=0; i<r; i++)
    54         {
    55             int u, v;
    56             scanf ("%d %d", &u, &v);
    57             Add (u, v);
    58             Add (v, u);
    59         }
    60         
    61         scanf ("%d %d", &s, &e);
    62         memset (a, -1, sizeof(a));
    63         memset (b, -1, sizeof(b));
    64         bfs (s, a);
    65         bfs (e, b);
    66         
    67         int ans = 0;
    68         for (int i=0; i<n; i++)
    69             ans = max (ans, a[i]+b[i]);
    70         printf("Case %d: %d
    ", cas++, ans);
    71     }
    72     return 0;
    73 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    兼容IE的滚动条自定义样式
    vue从入门到开发--4--处理http请求
    vue从入门到开发--3-基础语法
    Oracle 扩容表空间
    Oracle 整库备份还原
    Oracle 相关命令
    更改mysql数据库根目录
    关于文件系统
    挂载iscsi存储
    挂载nfs存储
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4737512.html
Copyright © 2011-2022 走看看