LA UVaLive 6623 Battle for Silver (最大值,暴力)

题意:给定一个图,让你找一个最大的子图,在这个子图中任何两点都有边相连,并且边不交叉,求这样子图中权值最大的是多少。

析:首先要知道的是,要想不交叉,那么最大的子图就是四个点,否则一定交叉,然后就暴力就好,数据水,不会TLE的,才100多ms

代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    using namespace std;

    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 450 + 5;
    const int mod = 1e9 + 7;
    const char *mark = "+-*";
    const int dr[] = {-1, 0, 1, 0};
    const int dc[] = {0, 1, 0, -1};
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline int Min(int a, int b){ return a < b ? a : b; }
    inline int Max(int a, int b){ return a > b ? a : b; }
    inline LL Min(LL a, LL b){ return a < b ? a : b; }
    inline LL Max(LL a, LL b){ return a > b ? a : b; }
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    }
    vector<int> G[maxn];

    int a[maxn];
    int g[maxn][maxn];
    int ans;
    int pre[10];

    void dfs(int u, int d, int val){
        ans = Max(ans, val);
        if(d == 4)  return ;

        for(int i = 0; i < G[u].size(); ++i){
            int v = G[u][i];
            bool ok = true;
            for(int j = 0; j < d; ++j){
                if(!g[v][pre[j]]){ ok = false;  break; }
            }
            for(int j = 0; j < d; ++j)
                if(pre[j] == v){ ok = false;  break; }
            if(!ok)  continue;
            pre[d] = v;
            dfs(v, d+1, val+a[v]);
        }
    }

    int main(){
        while(scanf("%d %d", &n, &m) == 2){
            for(int i = 1; i <= n; ++i){
                scanf("%d", &a[i]);
                G[i].clear();
            }
            memset(g, 0, sizeof(g));
            for(int i = 0; i < m; ++i){
                int u, v;
                scanf("%d %d", &u, &v);
                g[u][v] = g[v][u] = 1;
                G[u].push_back(v);
                G[v].push_back(u);
            }
            ans = 0;
            for(int i = 1; i <= n; ++i){
                pre[0] = i;
                dfs(i, 1, a[i]);
            }
            printf("%d\n", ans);
        }
        return 0;
    }

  

时间: 2024-10-08 11:12:33

LA UVaLive 6623 Battle for Silver (最大值,暴力)的相关文章

UVAlive 6623 Battle for Silver(暴力+思路)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4634 思路:图中两条边之间不能交叉,则最终的选择的点集中的点只能有1,2,3,4个,暴力枚举即可. #include<cstdio> #include<cstring> #include<iostream> #include<

LA UVaLive 6855 Banks (水题,暴力)

题意:给定 n 个数,让你求最少经过几次操作,把所有的数变成非负数,操作只有一种,变一个负数变成相反数,但是要把左右两边的数加上这个数. 析:由于看他们AC了,时间这么短,就暴力了一下,就AC了.....并不明白 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #in

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 w

LA UVaLive 6625 Diagrams &amp; Tableaux (状压DP 或者 DFS暴力)

题意:给一个的格子图,有 n 行单元格,每行有a[i]个格子,要求往格子中填1~m的数字,要求每个数字大于等于左边的数字,大于上边的数字,问有多少种填充方法. 析:感觉像个DP,但是不会啊...就想暴力试试,反正数据量看起来不大才7,但是...TLE了,又换了一个暴力方法,2秒多过了,差点啊. 其实这是一个状压DP,dp[i][s]表示在第 i 列,在集合 s 中有方法数,那么怎么转移呢,这个还是挺简单的,就是判断第i+1列是不是比第 i 列都大于等于就ok了, 输入时先把行,转化成列,再计算,

UVALive 2145 Lost in Space(暴力)

题目并不难,就是暴力,需要注意一下输出形式和精度. #include<iostream> #include<cstdio> #include<cmath> using namespace std; #define maxn 100 #define jd 0.0001 double x[maxn],y[maxn],z[maxn],d,e,f; double getdis(double x,double y,double z,double x1,double y1,doub

LA UVaLive 6862 Triples (数学+分类讨论)

题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数学题加分类讨论.首先对 x进行分类讨论. 当 0 = x 时,只要 y = z,就行,那么就有(m+1) *  (n-1) 个,因为 y 可能从0取到m ,j 可以从2取到 n. 当 0 != x 时,那么只要一个勾股定理能构成,只要幂大于2,就一下没解,所以我们把第一种中拿出j = 2时,的特殊情况,特殊考

LA UVaLive 7374 Racing Gems (DP,LIS)

题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. 析:那个v是怎么变那个是不变的.比例考虑每个钻石的向下辐射范围,并且将其投影到x轴上的两个点,(辐射范围与x轴的两个焦点),然后我们就把题目转化成了一个区间覆盖问题, 我们用x<y表示x区间被y区间覆盖,即求二维最长的上升子序列:a1<=a2<=...<=an. 我们按每个钻石的左端

LA UVaLive 6628 Grachten (水题,数学)

题意:给定一个平面图形并且且给了几条连,求一条. 析:简单么,三角形相似,很简单就AC. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cst

LA UVaLive 7375 Hilbert Sort (递归,四分图,模拟)

题意:告诉你一条希尔伯特曲线的大小,然后给你n 个人,及n 个人的坐标,你的起点是左下角,终点是右下角,按照希尔伯特的曲线去走,按照这个顺序给n个人排序, 按顺序输出每个人的名字! 析:这就是一个四分图,每次都把当前的图分成四份,左下角的是顺时针旋转,左上角和右上角不变,右下角逆时针旋转90,那么我们就递归这个过程,给所给的人编号, 最后再按编号输出即可. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #in