标签:int auto 5426 BFS vis vector ans push LC.191
LC.191.5426. 重新规划路线(BFS&DFS)
传送门
思路:1.建立反图DFS,先用从0开始进行反图DFS,反图能走的路不用修改。然后再对正图进行DFS,用正图每遍历到一个点答案+1,就可以。
2.BFS,因为是一棵树,最后肯定是以0为根的形状,然后用一个二维数组存一下每个结点所在的编号,从0开始遍历,若有不能到达的,就答案加1,然后入队,继续BFS。
3.先对边集从小到大排,然后用并查集判断当前边终点是否在集合内,在就加入起点,否则答案+1,加入终点。
方法1代码:
const int N=5e4+5;
class Solution {
public:
vector<int>e[N];
vector<int>fe[N];
bool vis[N];
int ans;
void dfs(int u){
for(auto v:fe[u]){
if(!vis[v]) vis[v]=1,dfs(v);
}
for(auto v:e[u]){
if(!vis[v]) ans++,vis[v]=1,dfs(v);
}
}
int minReorder(int n, vector<vector<int>>& p) {
for(auto it:p){
int u=it[0],v=it[1];
e[u].push_back(v);
fe[v].push_back(u);
}
vis[0]=1;
dfs(0);
return ans;
}
};
方法2代码:
class Solution{
public:
int minReorder(int n, vector<vector<int>>& p) {
vector<vector<int>> id(n, vector<int>());
for (int i = 0; i < n-1; i++) {
id[p[i][0]].push_back(i);
id[p[i][1]].push_back(i);
}
vector<bool>vis(n, 0);
int ans = 0;
queue<int>q;
q.push(0);
while (!q.empty()) {
int u= q.front();
q.pop();
for (auto it: id[u]) {
if (vis[it]) continue;
vis[it] = true;
int x=p[it][0],y=p[it][1];
ans+=(x==u);
x=(x==u)?y:x;
q.push(x);
}
}
return ans;
}
};
方法3:
class Solution {
public:
int minReorder(int n, vector<vector<int>>& p) {
set<int>s;
s.insert(0);
int ans=0;
sort(p.begin(),p.end(),cmp);
for(auto a:p){
if(s.count(a[1])) s.insert(a[0]);
else ans++,s.insert(a[1]);
}
return ans;
}
private:
static bool cmp(vector<int> &a,vector<int> &b){
int x=min(a[0],a[1]),y=min(b[0],b[1]);
return x<y;
}
};
标签:int,auto,5426,BFS,vis,vector,ans,push,LC.191 来源: https://blog.csdn.net/weixin_45750972/article/details/106454615
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。