leetcode5932.合法重新排列数对(困难,周赛,欧拉通路)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
典型的有向图求欧拉通路 套模板

class Solution {
public:
    unordered_map<int, int> ump; //节点->度数
    vector<int> ans1;
    vector<vector<int>> ans2;
    unordered_map<int, vector<int>> ump2; //节点->该节点可以到达的节点
    void dfs(int start) {
        while (ump2[start].size()) {
            int tmp = ump2[start].back();
            ump2[start].pop_back();
            dfs(tmp);
        }
        ans1.push_back(start);
    }
    vector<vector<int>> validArrangement(vector<vector<int>>& pairs) {

        for (auto& each : pairs) {
            ump2[each[0]].push_back(each[1]);
            ump[each[0]]--;
            ump[each[1]]++;
        }
        bool flag = false;
        for (auto& each : ump) { //找起点,如果是半欧拉图在这里执行dfs
	        if (each.second == -1) {
                flag = true;
                dfs(each.first);
            }
        }
        if (!flag) dfs(pairs[0][0]); //如果是欧拉图在这里执行dfs,从任意起点开始dfs
        reverse(ans1.begin(), ans1.end());
        for (int i = 0; i < ans1.size() - 1; ++i) { //将路径转换成pair对
            ans2.push_back(vector<int>{ans1[i], ans1[i + 1]});
        }
        return ans2;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值