• Codeforces Round #693 (Div. 3)G. Moving to the Capital(dfs)


    G. Moving to the Capital

    题意

    给你n个点m条长度为1的单向边,其中顶点1为中心城市,然后d[i]表示(1->i)的距离。

    要求:有一次特殊操作可以从(d[i] > d[j], i -> j),其他的都只能(d[i] < d[j], i ->j)。问你各个顶点在符合要求的条件下移动,其能离顶点1最小的(d[])是多少

    思路

    我们发现在一直移动只能从满足(d[i] < d[j], i ->j),那么当我们进行唯一的一次特殊操作时,其移动到的一定是(d[])最小的。所以我们考虑dfs然后加个判断。

    因为直接裸跑dfs会超时,所以我们使用记忆化的dfs来减小时间。

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N = 2e5 + 100;
    
    #define int long long
    typedef long long LL;
    
    
    struct EDGE{
    	int to, next;
    }edge[N];
    int head[N], tot;
    
    void add(int u, int v) {
    	edge[++tot].to = v;
    	edge[tot].next = head[u];
    	head[u] = tot;
    }
    int d[N];
    bool v1[N];
    int n, m;
    void bfs1() {
    	queue<int>Q;
    	Q.push(1);
    	for (int i = 1; i <= n; ++i)d[i] = 1e9 + 10;
    	d[1] = 0;
    	while (!Q.empty()) {
    		int u = Q.front();
    		Q.pop();
    		if (v1[u])continue;
    		v1[u] = true;
    		for (int i = head[u]; i; i = edge[i].next) {
    			int v = edge[i].to;
    			if (d[v] > d[u] + 1) {
    				d[v] = d[u] + 1;
    				Q.push(v);
    			}
    		}
    	}
    }
    
    int ans[N];
    bool v2[N];
    void dfs(int u) {
    	if (v2[u]) return ;
    	for (int i = head[u]; i; i = edge[i].next) {
    		int v = edge[i].to;
    		if (d[v] <= d[u])ans[u] = min(d[v], ans[u]);//特殊判断
    		else {
    			dfs(v);
    			ans[u] = min(ans[u], ans[v]);
    		}
    	}
    	v2[u] = true;
    }
    
    void solve() {
    	cin >> n >> m;
    	for (int i = 1; i <= n; ++i) {
    	 v1[i] = 0;head[i] = 0;v2[i] = 0;
    	}
    	tot = 0;
    	for (int i = 1; i <= m; ++i) {
    		int u, v; cin >> u >> v;
    		add(u, v);
    	}
    	bfs1();
    	for (int i = 1; i <= n; ++i) ans[i] = d[i];
    	dfs(1);
    	for (int i = 1; i <= n; ++i) cout << ans[i] << " ";
    	cout << endl;
    
    }
    
    
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
        int T = 1;
        cin >> T;
        while (T--) {
            solve();
        }
    
    }
    
  • 相关阅读:
    NYOJ 32(组合数)
    NYOJ 289(01背包)
    批量修改文件(图片)名称
    解决IIS7虚拟目录出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题
    MPP(最下正周期)
    wcf学习网站
    winform中用户输入查询与拼音首字母的结合,提高用户的操作体验 (转)
    通过SvcUtil.exe生成客户端代码和配置(转)
    WinMail 搭建邮件服务器。
    quick easy ftp server软件在机子上架设了个服务器
  • 原文地址:https://www.cnblogs.com/waryan/p/14295043.html
Copyright © 2020-2023  润新知