后台-插件-广告管理-内容页广告位一(手机)

您现在的位置是:首页 > 开发类 > 移动开发移动开发

【2021四川省赛】E.Don‘t Really Like How The Story Ends 图论

2021-06-05 09:11:33移动开发人已围观

简介2021四川省赛E Don’t Really Like How The Story Ends题目大意给图加边,使得一个可能的DFS序列刚好是从1到nTime : 1000 msMemory: 262144 kB解题思路及分析第一次打正式比赛,场上E因为自己的nt行为T了好几发,这个是赛后补题直接搜索,但是需要有一定条件如果想要DFS序列刚好为从1到N,需要满足的条件:如果vvv与v+1v+1v+1直接相连,则访问搜索v+1v+1v+1如果vvv点存在没有访问的相邻节点且.

2021四川省赛E

Don’t Really Like How The Story Ends

题目大意

给图加边,使得一个可能的DFS序列刚好是从1到n

Time : 1000 ms
Memory: 262144 kB

解题思路及分析

第一次打正式比赛,场上E因为自己的nt行为T了好几发,这个是赛后补题
直接搜索,但是需要有一定条件
如果想要DFS序列刚好为从1到N,需要满足的条件:

  1. 如果 v v v与 v + 1 v+1 v+1直接相连,则访问搜索 v + 1 v+1 v+1
  2. 如果 v v v点存在没有访问的相邻节点且 v v v点不与 v + 1 v+1 v+1点相连,此时必须将 v + 1 v+1 v+1连接到 v v v上
  3. 如果 v v v点所有相邻节点都被访问了, v + 1 v+1 v+1可以与 v v v相连,也可以和从 1 1 1=> v v v中路径上的任意一点相连,路径上的点都在递归栈里面,此时可以让 v v v点退栈,一直回到某个满足条件 1 1 1或 2 2 2的节点
  4. 如果第3点的点退栈一直到起点1号点都没有直接相连,说明存在不连通部分,此时必须加边,此时再去搜索不连通的部分,一直到全部搜索完

AC代码

#include <bits/stdc++.h>
typedef long long llong;
const int N = 1e5 + 5;
using namespace std;
vector<int> mp[N];
bool vis[N];
int cnt;
int n, m, nxt;

void dfs(int u) {
    nxt++;
    for (int i = 0; i < mp[u].size(); i++) {
        int to = mp[u][i];
        if (vis[to]) continue;
        if (to == nxt) {	// [1]
            vis[nxt] = true;
            dfs(nxt);
        } else {			// [2]
            cnt++;
            vis[nxt] = true;
            dfs(nxt);
            i--;
        } 
    }
    if (u == 1) {			// [3] [4]
        while (nxt <= n) {
            vis[nxt] = true;
            dfs(nxt);
            cnt++;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    int T;	cin >> T;
    while (T--) {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            mp[i].clear();
            vis[i] = false;
        }
        nxt = 1;
        cnt = 0;
        for (int i = 0; i < m; i++) {
            int u, v;
            cin >> u >> v;
            if (u < v)  mp[u].push_back(v);
            if (u > v)  mp[v].push_back(u);	// 一个小优化,只由编号小的节点连接到编号大的节点
        }
        for (int i = 1; i <= n; i++) {
            sort(mp[i].begin(), mp[i].end());	
            // 这里进行排序,就可以保证每次访问的节点都是最小的,方便判断刚刚解题思路中说的条件
            // 不要用堆,亲测会T(场上nt的我)
        }
        vis[1] = true;
        dfs(1);
        cout << cnt << endl;
    }
    return 0;
}

文章来源:https://blog.csdn.net/weixin_45717583/article/details/117512217

Tags:

很赞哦! ()

后台-插件-广告管理-内容页广告位二(手机)

相关文章

后台-插件-广告管理-内容页广告位三(手机)
后台-插件-广告管理-内容页广告位四(手机)

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计60062篇文章
  • 浏览统计4401次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们