zoukankan      html  css  js  c++  java
  • CDOJ 889 Battle for Silver

    Battle for Silver

    Time Limit: 2999/999MS (Java/Others)     Memory Limit: 65432/65432KB (Java/Others)

    Piet Hein was a Dutch naval officer during the Eighty Years' War between the United Provinces of The Netherlands and Spain. His most famous victory was the capture of the Zilvervloot (Silver Fleet) near Cuba in 1628, where he intercepted a number of Spanish vessels that were carrying silver from the Spanish colonies in the Americas to Spain. Details about this famous naval battle are sketchy, so the description below may contain some historical inaccuracies.

    The Silver Fleet consisted of vessels containing silver coins. Piet Hein's basic strategy was simple: tow away a number of vessels from the fleet, in order to capture their contents.

    In an attempt to prevent the Dutch from carrying out this plan, the Spanish tied all the ships in their fleet together using huge iron chains. Each vessel in their fleet was fixed to at least one other vessel; any two vessels were connected by at most one chain; and the Spanish made sure that the chains did not cross each other, otherwise they could get tied up into a knot. As an end result, the vessels and the chains connecting them formed a connected, planar graph.

    However, the Spanish preventive measures only made their situation worse. As an experienced naval officer, Piet Hein knew that towing away a group of ships was easiest if, for every two ships in the group, the ships were connected by a chain. He called such groupschaingroups.

    Piet Hein ordered his men to tow away all the ships in the chaingroup that contained the largest amount of booty, after severing the links with the remaining ships in the Spanish fleet with a few highly accurate canon shots. The total booty in a chaingroup is the total number of silver coins in the vessels that make up the chaingroup.

    title

    The Silver Fleet represented as a graph: each dot denotes a vessel in the fleet, while each line denotes a chain that connects two vessels. The vessels that are connected in the figure by the dashed lines correspond to the chaingroup that provides the highest total value of silver coins. In this case, Piet Hein loots 4500 silver coins from the fleet.

    Given a description of the Silver Fleet, find the value of the chaingroup with the highest amount of booty (i.e., total number of silver coins in the ships that make up the chaingroup).

    Input

    For each test-case:

    • A line containing two integers v (2v450) and e (1e900), the number of vessels in the fleet and the number of chains, respectively.
    • Then, v lines specifying S1,S2,,Sv, the amount of silver coins carried by vessel i (1iv). The Si will be positive integers, where 100Si6000.
    • Then, for each chain, a line containing two integers cstart and cend, the two vessels connected by the chain, where (1cstart<cendv).

    Each fleet forms a connected, planar graph.

    Output

    For each test case, one line containing a single positive integer: the number of silver coins that is captured by Piet Hein's fleet.

    Sample Input

    4 6
    100
    5000
    1000
    2000
    1 2
    1 3
    1 4
    2 3
    2 4
    3 4
    6 8
    1500
    1000
    100
    2000
    500
    300
    1 2
    1 3
    1 4
    2 4
    3 5
    4 5
    4 6
    5 6

    Sample Output

    8100
    4500

    解题:dfs搜索。哎,好久未写搜索,当时居然脑残了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <climits>
     7 #include <vector>
     8 #include <queue>
     9 #include <cstdlib>
    10 #include <string>
    11 #include <set>
    12 #include <stack>
    13 #define LL long long
    14 #define pii pair<int,int>
    15 #define INF 0x3f3f3f3f
    16 using namespace std;
    17 const int maxn = 510;
    18 bool g[maxn][maxn],done[maxn];
    19 int n,ans,p[maxn],w[maxn];
    20 bool ok(int m,int x){
    21     for(int i = 0; i < m; i++)
    22         if(!g[p[i]][x]) return false;
    23     return true;
    24 }
    25 void dfs(int m,int k,int sum){
    26     ans = max(ans,sum);
    27     if(m == 4) return;
    28     for(int i = k+1; i <= n; i++){
    29         if(!done[i] && ok(m,i)){
    30             done[i] = true;
    31             p[m] = i;
    32             dfs(m+1,i,sum+w[i]);
    33             done[i] = false;
    34         }
    35     }
    36 }
    37 int main() {
    38     int i,m,u,v;
    39     while(~scanf("%d %d",&n,&m)){
    40         for(i = 1; i <= n; i++)
    41             scanf("%d",w+i);
    42             memset(g,false,sizeof(g));
    43         for(i = 0; i < m; i++){
    44             scanf("%d %d",&u,&v);
    45             g[u][v] = g[v][u] = true;
    46         }
    47         ans = 0;
    48         dfs(0,0,0);
    49         printf("%d
    ",ans);
    50     }
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    (15)树莓派系统安装和备份
    (0-0) 树莓派学习资料
    (14)树莓派
    (0-1) 树莓派常用软件及服务
    (13)flask搭建服务器
    (12)树莓派串口通信
    OpenCV 学习笔记(0)两幅图像标定配准
    OpenCV 学习笔记(9)RGB转换成灰度图像的一个常用公式Gray = R*0.299 + G*0.587 + B*0.114
    OpenCV 学习笔记(8)彩色图像RGB通道的分离、合并与显示
    Arduino OV7670 live image over USB to PC
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3944717.html
Copyright © 2011-2022 走看看