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;
}
};
四、总结
一开始没有仔细看一下样例,写了个假做法,浪费了二十分钟。以后应该手动算一下样例,可以避免自己的想当然。