【LeetCode 685】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

100 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情

一、题目描述

给定一张有向图,n条边,n个节点,求删除哪一条边后使得图变成一棵树。

数据范围

n <= 1000

二、思路分析

因为数据很小,所以我们可以直接暴力,每次剔除某一条边,然后跑一边dfs,如果能建成一棵完整的树,就应该删的是这条边。

附:关于 vector 的清空方法

  • v.clear() 清空元素,但不回收内存
  • v.swap(vector<int>()) 清空元素并回收内存

三、AC代码

class Solution {
public:
    int a[1005],b[1005],count,pd[1005],f[1005];
    vector<int> mp[1005]; 
    void dfs(int t) {
        count++;
        pd[t] = 1;
        int n = mp[t].size();
        for (int i=0; i<n; i++) {
            if (pd[mp[t][i]]==0) {
                dfs(mp[t][i]);
            }
        }
        return;
    }
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
        int n = edges.size();
        vector<int> ans;
        for (int k=0; k<n; k++) {
            for (int i=1; i<=n; i++) {
                f[i] = -1;
                pd[i]=0;
                mp[i].clear();
                count=0;
            }
            for (int i=0; i<n; i++) {
                if (i==k) continue;
                int u = edges[i][0];
                int v = edges[i][1];
                mp[u].push_back(v);
                f[v] = u;
            }
            for (int i=1; i<=n; i++) {
                if (f[i] == -1) {
                    dfs(i);
                    if (count == n) ans = edges[k];
                    break;
                }
            }
        }
        return ans;
    }
};

四、总结

一开始没有仔细看一下样例,写了个假做法,浪费了二十分钟。以后应该手动算一下样例,可以避免自己的想当然。