DFS HDOJ 5348 Ponds

题目传送门

题意:有一张无向图,度数小于2的点会被去掉,直到全都大于等于2,问连通块顶点数为奇数的权值和为多少

分析:首先DFS把度数小于2的vis掉,第二次DFS把属于同一个连通块的vis掉,检查是否为奇数个定点,是累加和。用sz[i]表示i点真实还连着的点的个数

代码:

/************************************************
* Author        :Running_Time
* Created Time  :2015/9/13 星期日 15:34:01
* File Name     :B.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e4 + 10;
const int E = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
vector<int> G[N];
int a[N], sz[N];
bool vis[N];
int n, m, cnt;
ll sum;

void init(void) {
    for (int i=1; i<=n; ++i)    G[i].clear ();
    memset (vis, false, sizeof (vis));
}

void DFS(int u)    {
    for (int i=0; i<G[u].size (); ++i)  {
        int v = G[u][i];
        if (vis[v]) continue;
        sz[v]--;
        if (sz[v] <= 1) {
            vis[v] = true;  DFS (v);
        }
    }
}

void DFS2(int u)    {
    sum += a[u];    cnt++;
    for (int i=0; i<G[u].size (); ++i)  {
        int v = G[u][i];
        if (vis[v]) continue;
        vis[v] = true;  DFS2 (v);
    }
}

int main(void)    {
    int T;  scanf ("%d", &T);
    while (T--) {
        scanf ("%d%d", &n, &m);
        init ();
        for (int i=1; i<=n; ++i)    scanf ("%d", &a[i]);
        for (int u, v, i=1; i<=m; ++i)  {
            scanf ("%d%d", &u, &v);
            G[u].push_back (v); G[v].push_back (u);
        }
        for (int i=1; i<=n; ++i)    sz[i] = G[i].size ();
        for (int i=1; i<=n; ++i)    {
            if (vis[i]) continue;
            if (sz[i] <= 1) {
                vis[i] = true;  DFS (i);
            }
        }
        ll ans = 0;
        for (int i=1; i<=n; ++i)    {
            if (vis[i]) continue;
            sum = 0;    cnt = 0;
            vis[i] = true;  DFS2 (i);
            if (cnt & 1)    ans += sum;
        }
        printf ("%I64d\n", ans);
    }

    return 0;
}

  

时间: 2024-11-01 19:28:38

DFS HDOJ 5348 Ponds的相关文章

图论 HDOJ 5348 MZL&#39;s endless loop

题目传送门 1 /* 2 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 3 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜,当碰到另外一个奇度顶点时结束,这样能保证度数差<=1 3.5 详细解释:http://blog.csdn.net/ZSGG_ACM/article/details/47287681 4 */ 5 /*********************************************

DFS HDOJ 5339 Untitled

题目传送门 1 /* 2 DFS:从大到小取模,因为对比自己大的数取模没意义,可以剪枝.但是我从小到大也过了,可能没啥大数据 3 */ 4 /************************************************ 5 Author :Running_Time 6 Created Time :2015-8-1 18:57:52 7 File Name :A.cpp 8 *************************************************/ 9

DFS HDOJ 2181 哈密顿绕行世界问题

题目传送门 题意:中文题面 分析:直接排完序后DFS.这样的题以后不应该再写题解的. #include <bits/stdc++.h> using namespace std; vector<int> G[21]; int ans[21]; int v[3]; bool vis[21]; int cnt; void print() { printf ("%d: ", ++cnt); for (int i=0; i<20; ++i) { printf (&q

拓扑排序/DFS HDOJ 4324 Triangle LOVE

题目传送门 题意:判三角恋(三元环).如果A喜欢B,那么B一定不喜欢A,任意两人一定有关系连接 分析:正解应该是拓扑排序判环,如果有环,一定是三元环,证明. DFS:从任意一点开始搜索,搜索过的点标记,否则超时.看是否存在两点路程只差等于2,如果存在,则说明有上述的三角环.其他做法. 收获:DFS搜索一定要用vis数组啊,否则很容易超时的 代码(拓扑排序): /************************************************ * Author :Running_T

2015多校训练5题解与代码

首先呢,要废话一段..这场是见过的所有多校中最最亲民的.因为英文题面都很短.但是是最考验智商的一次(除去那个化学第一电离能)... 赛后补题在题解和各大巨巨的帮助下能够补到7题也是醉了.说明题就是考模型建立,没有考到多深的知识点. 戳我见官方题解 1002:HDOJ 5344 第一眼看上去就是亦或啊,又是数学啊,又是不能暴力的.the xor of all (Ai+Aj)(1≤i,j≤n)这是关键句.根据题意把需要的写出来,发现所有i!=j的,都可以利用a^a=0消除,所有只剩下i==j的.最后

hdu5438 Ponds dfs 2015changchun网络赛

Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 533    Accepted Submission(s): 175 Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, an

hdu 5438 Ponds dfs

Time Limit: 1500/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others) Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, and there will not be more than one pipe between two ponds. Ea

hdoj 1045 Fire Net 【DFS】

题意:如果两个点要放在同一行或者同一列,那么两个点中间要有一个墙,否则的话只能放一个点,最后问你最多能放几个点. 看了一个星期.. 这道题的解法我还是第一次见,就是逐个逐个的来放置每个点,然后每经过一个点都判断一次,详情看代码 代码: #include <stdio.h> #include <string.h> int ans, n; char map[10][10]; int judge(int lin, int row) { int i; for(i = lin-1; i &g

hdoj 1455 Sticks 【dfs】

题意:找最短的木棍能够组成的长度, hdoj  1518 的加强版 代码: #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; #define M 70 int s[M], vis[M]; int n, ans; int cmp(int a, int b) { return a > b; } int dfs(int cou, int cur, int pos) {