BestCoder Round #53

现在博客更新比较少了,就当我还活着吧


Rikka with Graph

题目传送:HDU - 5422 - Rikka with Graph

AC代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;

int n, m;

int main() {
    while(scanf("%d %d", &n, &m) != EOF) {
        int u, v;
        int flag = 0;
        for(int i = 0; i < m; i ++) {
            scanf("%d %d", &u, &v);
            if((u == 1 && v == n) || (u == n && v == 1)) flag = 1;
        }
        if(flag == 1) printf("1 %d\n", n * (n - 1) / 2);
        else printf("1 1\n");
    }
    return 0;
}

Rikka with Tree

题目传送:HDU - 5423 - Rikka with Tree

AC代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 1005;
int n;
vector<int> G[maxn];

bool judge1() {
    if(G[1].size() <= 0 || G[1].size() >= 2) {
        return false;
    }
    int pre = 1;
    int v = G[1][0];
    while(G[v].size() == 2) {
        for(int i = 0; i < 2; i ++) {
            if(G[v][i] != pre) {
                pre = v;
                v = G[v][i];
                if(G[v].size() == 1) return true;
                break;
            }
        }
    }
    return false;
}

bool judge2() {
    if(G[1].size() != n - 1) return false;
    return true;
}

bool judge3() {
    if(G[1].size() != 1) {
        return false;
    }
    int cnt = 1;
    int pre = 1;
    int v = G[1][0];
    while(G[v].size() == 2) {
        for(int i = 0; i < 2; i ++) {
            if(G[v][i] != pre) {
                pre = v;
                v = G[v][i];
                cnt ++;
                break;
            }
        }
        if(G[v].size() != 2) break;
    }
    //cout << n << " " << cnt << endl;
    if(G[v].size() == n - cnt) return true;
    return false;
}

int main() {
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i < maxn; i ++) G[i].clear();

        int u, v;
        for(int i = 1; i < n; i ++) {
            scanf("%d %d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }

        if(judge1() || judge2() || judge3()) {
            printf("YES\n");
        }
        else printf("NO\n");
    }
    return 0;
}

Rikka with Graph II

题目传送:HDU - 5424 - Rikka with Graph II

官方题解:

如果图是连通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点,从那个点开始直接DFS搜索哈密顿路径复杂度是O(n)的。要注意先判掉图不连通的情况。

AC代码:

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 1005;
int n;

vector<int> G[maxn];
map<pair<int, int>, int> mp;
int deg[maxn];
int vis[maxn];

bool dfs(int u, int cnt) {
    vis[u] = 1;
    if(cnt == n) return true;
    int d = G[u].size();
    for(int i = 0; i < d; i ++) {
        int v = G[u][i];
        if(!vis[v]) {
            if(dfs(v, cnt + 1)) return true;
            vis[v] = 0;
        }
    }
    return false;
}

int cnt;
void judge(int u) {
    vis[u] = 1;
    cnt ++;
    int d = G[u].size();
    for(int i = 0; i < d; i ++) {
        int v = G[u][i];
        if(!vis[v]) {
            judge(v);
        }
    }
}

int main() {
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i <= n; i ++) G[i].clear();
        mp.clear();
        memset(deg, 0, sizeof(deg));
        int u, v;
        for(int i = 0; i < n; i ++) {
            scanf("%d %d", &u, &v);
            if(u == v) continue;
            if(mp.find(make_pair(u, v)) != mp.end() || mp.find(make_pair(v, u)) != mp.end() ) {
                continue;
            }
            G[u].push_back(v);
            G[v].push_back(u);
            deg[u] ++;
            deg[v] ++;
            mp[make_pair(u, v)] = 1;
        }

        int mi = INF;
        int id;
        for(int i = 1; i <= n; i ++) {
            if(deg[i] < mi) {
                mi = deg[i];
                id = i;
            }
        }

        memset(vis, 0, sizeof(vis));
        cnt = 0;
        judge(1);//特判不连通的情况,因为如果不连通直接dfs会因为回溯太多次而超时
        if(cnt != n) {
            printf("NO\n");
            continue;
        }

        memset(vis, 0, sizeof(vis));
        //cout<< id << endl;
        if(dfs(id, 1)) {
            printf("YES\n");
        }
        else printf("NO\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 13:14:46

BestCoder Round #53的相关文章

BestCoder Round #53(hdu 5422&amp;5423&amp;5424)

hdu 5422: 题意:给出一个n个顶点,m条变的无向图,现在让你添加一条边,使1到n的最短路最短,并且在最短的情况下写出可以添加的边的不同数目. 思路:很简单,两种情况:1.如果1到n之间原来不存在边,那么我们添加的这一条边肯定是1~n,所以最短路一定是1,方法只有一种:2.如果1和n之间原来存在边,那么我们就随意连两个顶点即可,方法是n*(n-1)/2. #include <iostream> #include <string> #include <cstring>

BestCoder Round #53 (div.1)

Problem A: 题目大意: 给出以节点1为根的一棵树A,判断它是否是特殊的.一棵树是特殊的当且仅当不存在和它不完全相同的一棵树B,使得A中点i到点1的距离和B中相等. 题解: 假设一个点x的深度是d,它的父亲是y,如果存在一个深度为d-1的点z,那么把x从y下面移到z下面就可以得到树B了.所以求出每个深度的点的个数,只有当所有深度的点的个数都为1,最大深度的点的个数任意的时候 树是特殊的. Problem B: 题目大意: 给出N个点N条边的无向图判断是否存在哈密顿路. N<=1000.

哈密顿图 BestCoder Round #53 (div.2) 1003 Rikka with Graph II

题目传送门 题意:判断是否为哈密顿图 分析:首先一种情况是不合法的:也就是度数为1的点超过2个:合法的有:,那么从度数为1的点开始深搜,如果存在一种走法能够走完n个点那么存在哈密顿路 收获:学习资料 代码: /************************************************ * Author :Running_Time * Created Time :2015-8-29 20:37:34 * File Name :C.cpp *******************

hdu 5424 Rikka with Graph II (BestCoder Round #53 (div.2))(哈密顿通路判断)

http://acm.hdu.edu.cn/showproblem.php?pid=5424 哈密顿通路:联通的图,访问每个顶点的路径且只访问一次 n个点n条边 n个顶点有n - 1条边,最后一条边的连接情况: (1)自环(这里不需要考虑): (2)最后一条边将首和尾连接,这样每个点的度都为2: (3)最后一条边将首和除尾之外的点连接或将尾和出尾之外的点连接,这样相应的首或尾的度最小,度为1: (4)最后一条边将首和尾除外的两个点连接,这样就有两个点的度最小,度都为1 如果所给的图是联通的话,那

HDU 5432 Rikka with Tree (BestCoder Round #53 (div.2))

题目大意:给你一个树 判断这棵树是否是独特的 一颗树是独特的条件:不存在一颗和它本身不同但相似的树 两颗树相似条件:两颗树中点的数量相等且相对应的点的深度相同 如第2个样例 4 1 2 2 3 1 4 与 4 1 2 1 4 3 4 如图:这两棵树的点的数量相等且相应的点的深度deep相同,所以这两棵树相似,所以样例2存在一颗树与它不同但相似,即不特殊 运用广搜统计每个点的深度 要想一颗树特殊,只有保证他的分支下面不再有子节点 #include<stdio.h> #include<str

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

BestCoder Round #88

传送门:BestCoder Round #88 分析: A题统计字符串中连续字串全为q的个数,预处理以下或加个cnt就好了: 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <ctime> 5 #include <cmath> 6 #include <iostream> 7 #include <algorithm> 8

从lca到树链剖分 bestcoder round#45 1003

bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分.为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O(n), 那么q次询问的时间复杂度是O(qn) 什么是树链剖分呢? 就是把树的边分成轻链和重链 http://blogsina.com.cn/s/blog_6974c8b20100zc61.htmlh

BestCoder Round #32

PM2.5 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 613    Accepted Submission(s): 326 Problem Description Nowadays we use content of PM2.5 to discribe the quality of air. The lower content of