题目来源:
leetcode题目,网址:1466. 重新规划路线 - 力扣(LeetCode)
解题思路:
1. 暴力遍历,超时。
2.忽略边的方向进行深度优先遍历,与此同时,记录反向边的条数。
解题代码:
//暴力遍历
class Solution {
public:
int minReorder(int n, vector<vector<int>>& connections) {
unordered_set<int> canGet;
canGet.insert(0);
int res=0;
while(canGet.size()!=n){
vector<vector<int>> newCons;
for(int i=0;i<connections.size();i++){
int from=canGet.count(connections[i][0]);
int to=canGet.count(connections[i][1]);
if(from==0 && to==0){
newCons.push_back(connections[i]);
}else if(from==0 && to==1){
canGet.insert(connections[i][0]);
}else{ //from==1 && t0==0
res++;
canGet.insert(connections[i][1]);
}
}
connections=newCons;
cout<<connections.size()<<endl;
}
return res;
}
};
//2
class Solution {
public:
int minReorder(int n, vector<vector<int>>& connections) {
vector<vector<pair<int,int>>> edges(n); // edges[x][0]=pair(y,z); 若z为-1,表示边为 y->x;若 z为 1,则边为x->y
for(int i=0;i<connections.size();i++){
edges[connections[i][0]].push_back(make_pair(connections[i][1],1));
edges[connections[i][1]].push_back(make_pair(connections[i][0],-1));
}
return dfs(0,-1,edges);
}
int dfs(int pos, int parent,vector<vector<pair<int,int>>>& edges){
int res=0;
for(pair<int,int> edge:edges[pos]){
if(edge.first==parent){
continue;
}
if(edge.second==1){
res+=1;
}
res+=dfs(edge.first,pos,edges);
}
return res;
}
};
总结:
没做出来,看官方题解的。