Aizu - 2306 Rabbit Party (DFS图论)

G. Rabbit Party

Time Limit: 5000ms

Case Time Limit: 5000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

Submit Status pid=39423" class="goprob button ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" style="margin:0px 0.1em 0px -1px; padding:0px; text-decoration:none; font-family:‘Trebuchet MS‘,Helvetica,Arial,sans-serif; font-size:1.1em; border:1px solid rgb(204,204,204); font-weight:bold; color:rgb(68,68,68); display:inline-block; position:relative; zoom:1; overflow:visible">PID:
39423

Font Size: 
+
 
-

Rabbit Party

A rabbit Taro decided to hold a party and invite some friends as guests. He has n rabbit friends, and m pairs of
rabbits are also friends with each other. Friendliness of each pair is expressed with a positive integer. If two rabbits are not friends, their friendliness is assumed to be 0.

When a rabbit is invited to the party, his satisfaction score is defined as the minimal friendliness with any other guests. The satisfaction of the party itself is defined as the sum of satisfaction score for all the guests.

To maximize satisfaction scores for the party, who should Taro invite?

Write a program to calculate the maximal possible satisfaction score for the party.

Input

The first line of the input contains two integers, n and m (1
¥leq n ¥leq 100
0 ¥leq m ¥leq 100). The rabbits are numbered from 1to n.

Each of the following m lines has three integers, uv and fu and v (1
¥leq u, v ¥leq n
u ¥neq v1 ¥leq f ¥leq 1,000,000) stands for the rabbits‘ number, and f stands
for their friendliness.

You may assume that the friendliness of a pair of rabbits will be given at most once.

Output

Output the maximal possible satisfaction score of the party in a line.

Sample Input 1

3 3
1 2 3
2 3 1
3 1 2

Output for the Sample Input 1

6

Sample Input 2

2 1
1 2 5

Output for the Sample Input 2

10

Sample Input 3

1 0

Output for the Sample Input 3

0

Sample Input 4

4 5
1 2 4
1 3 3
2 3 7
2 4 5
3 4 6

Output for the Sample Input 4

16
分析题目,因为给你的全然图(即一个顶点与其它的顶点都有边)
接着从题目能够分析的n * (n - 1) / 2 = m <= 100
(提示。假设一个点与其它点之间的友好值为0,那么能够去掉这个点,或者那个与它的边为0的点。大家能够思考一下,所以为零的能够直接去掉)
得知n <= 15所以,实际上仅仅有15个数,那么我们能够DFS,得到这些数都是不会超时的


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
#include <map>
#include <set>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <algorithm>
using namespace std;

#define pb push_back
#define mp make_pair
#define fillchar(a, x) memset(a, x, sizeof(a))
#define copy(a, b) memcpy(a, b, sizeof(a))
#define S_queue<P> priority_queue<P, vector<P>,greater<P> >

typedef long long LL;
typedef pair<int, int > PII;
typedef unsigned long long uLL;
template<typename T>
void print(T* p, T* q, string Gap = " "){int d = p < q ? 1 : -1;while(p != q){cout << *p;p += d;if(p != q) cout << Gap; }cout << endl;}
template<typename T>
void print(const T &a, string bes = "") {int len = bes.length();if(len >= 2)cout << bes[0] << a << bes[1] << endl;else cout << a << endl;}

const int INF = 0x3f3f3f3f;
const int MAXM = 1e2 + 5;
const int MAXN = 1e2 + 5;
int Fig[MAXN][MAXN], Max;
int X[25], n, m;

void Deal(int s){
    int f , ans = 0;
    for(int i = 1;i <= s;i ++){
        f = INF;
        for(int j = 1;j <= s;j ++){
            if(i == j) continue;
            f = min(f, Fig[X[i]][X[j]]);
        }
    if(f != INF)
        ans += f;
    }
    Max = max(ans, Max);
}
void DFS(int u){
    Deal(u);
    int st = X[u] + 1;
    if(u == 0) st = 1;
    for(int i = st;i <= n;i ++){
        bool flag = true;
        for(int j = 1;j < u;j ++){
            if(Fig[i][X[j]] == 0) {
                flag = false;
                break;
            }
        }
        X[u + 1] = i;
        if(flag) DFS(u + 1);
    }
}

int main(){
    int u, v, d;
    while(cin >> n >> m){
        Max = 0;
        memset(Fig, 0, sizeof(Fig));
        for(int i = 1;i <= m;i ++){
            cin >> u >> v >> d;
            Fig[u][v] = Fig[v][u] = d;
            Max = max(Max, d * 2);
        }
        DFS(0);
        print(Max);
    }
    return 0;
}

时间: 2024-12-13 17:12:48

Aizu - 2306 Rabbit Party (DFS图论)的相关文章

Aizu 2306 Rabbit Party 爆搜顶点导出子图

题目链接:点击打开链接 题意: 给定n个点的完全图,下面给出m条边权不为0的边 下面m行给出边和边权. 其他的边边权都为0. 选择一个顶点导出子图,该子图的每个点点权为 该点连接的最小边权. 找一个这样的子图使得点权和最大,输出点权和. 思路: 因为是一个完全图,所以我们选择的点构成的图一定不包含权值为0的边.因为若包含了权值为0的边,则大可以把这两点删掉而不会减小答案. 所以我们选择的图中的边一定只 包含给出的m条边,且由这m条边构成的一个团. 再判断一下这个团中最多的点数,设最多有n个点,则

HDU 6201 transaction transaction transaction DFS 图论

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6201 题目描述: 有一棵节点的树, 每条边有权值, 可以任意选择起点和终点, 得到一个值 = 终点值 - 经过的边权值 - 起点值, 最大化这个值 解题思路: 我们先要求得的值是每个节点有书的时候的最小花费, 由于此最小花费可能是本节点买书, 也有可能是儿子买书, 现在我们将从叶子节点开始向上遍历, 这样只会使得所有的父子节点互相更新, 可是这个时候兄弟节点还没有更新, 所以我们做第二遍DFS由父

BZOJ 1603 Usaco 打谷机

感觉像是一道DFS图论的题目,建模并不难=w= #include <cstdio> #include <algorithm> struct node{ int u,v,val; }Edge[10005]; int n,Out[10005]; void dfs(int x,int now){ if(x>=n) return; int v = Edge[x].v; if(Edge[x].val) now = (now+1)%2; Out[v] = now; dfs(v,now);

PAT甲级专题|最短路

PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做,只能得20分 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 510; int cmax,n,ter,m; int caps[maxn]; int g[maxn][m

图论算法之DFS与BFS

概述(总) DFS是算法中图论部分中最基本的算法之一.对于算法入门者而言,这是一个必须掌握的基本算法.它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关键所在. 含义特点 DFS即深度优先搜索,有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 由于用到递归,当节点特别多且深度很大

对图论dfs的思考。

图论dfs可以说主宰了图论的大部分题目,所以对于他的理解非常重要: 深度优先遍历就如他的名字所说:只要可能,就在图中尽量深入,深度优先搜索总是对最近被发现的点最近发现的节点v出发进行搜索.直到该点的出发边都被发现为止,搜索则回到前驱节点,(v是由这个点发现的),在搜索其前驱节点的边,重复该过程直到源点所有出发边都被发现完,如果有节点没有被发现,则以这个点为开头,继续搜索. 在进行深度优先遍历时,我们对其节点进行涂色,开始,所有点都为白色,然后一旦被发现,即进栈,变成灰色,然后经过遍历,当其所有边

URAL 1557 Network Attack 图论,连通性,tarjain,dfs建树,分类讨论 难度:2

http://acm.timus.ru/problem.aspx?space=1&num=1557 1557. Network Attack Time limit: 2.0 secondMemory limit: 64 MB In some computer company, Mouse Inc., there is very complicated network structure. There are a lot of branches in different countries, so

数据结构之 图论---连通分量的个数(dfs搜索)

数据结构实验:连通分量个数 Time Limit: 1000MS Memory limit: 65536K 题目描述 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通.如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大. 例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量. 输入 第一行是一个整数T,表示有T组测试样例(0 < T <

【DFS】【图论】NOIP2014寻找道路

[NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点连通. 2.在满足条件1的情况下使路径最短. 注意:图G中可能存在重边和自环,题目保证终点没有出边. 请你输出符合条件的路径的长度. 输入描述 Input Description 第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边. 接下来的m行每行2个整数x.