顺丰(顺丰鄂州枢纽运转中心环线检测)拓扑排序

【背景】
鄂州花湖机场是亚洲第一个、世界第四个专业货运枢纽机场。2016年4月获中国民用航空局正式批复,2017年12月20日枢纽工程正式开工,2022年3月19日由顺丰航空使用波音B757-200F型全货机执行试飞成功,系中国首次以全货机机型完成新机场的试飞工作。
顺丰鄂州枢纽转运中心占地约百万平方,实现了快件从卸载(卸车/卸机)到分拣再到装车/打板全自动化。自动化设备运输线总长超过数十公里。如何保障快件最高效到达装车或打板口是核心需要解决的问题。
转运中心内自动化设备通过运输线连接,构成一张立体的连通网络,快件达到分流路口需要决策行走支路,确保全程线路最优前提下,同时要避免大量快件涌向最短线路造成拥堵,还需要及时避开故障线路上的故障设备,直到故障得到修复。
自动化运输线简化图如下:


卸载口代表快件行走起始节点,装载口代表快件经过路线行走后最终目的节点,节点代表从卸载口到达装载口途径线路的分流或汇流点,卸载口和装载口也是一种特殊的节点。
边代表两个相邻节点间自动化设备运输线,线路代表从起始节点到达目的节点(装载口)途径所有的边。
在整连通网络上不应该存在环形线路,环形线路可能会导致快件在运输线上长时间运输,以至于错过飞机或车辆班次,导致延误。因此在建立线路数据模型时应避免出现环。

【问题】
请帮忙检测线路上是否存在环形通路。

示例 1:

输入:
"1->2,2->3,3->1"

输出:
true

示例 2:

输入:
"1->4,2->5,3->6,3->7,4->8,5->8,5->9,6->9,6->11,7->11,8->12,9->12,9->13,10->13,10->14,11->10,11->14"

输出:
false

示例 3:

输入:
"1->4,2->5,3->6,3->7,4->8,5->8,5->9,6->9,6->11,7->11,8->12,9->12,9->13,10->6,10->13,10->14,11->10,11->14"

输出:
true

解释:
存在环线:6->11,11->10,10->6

提示:

  • 0 < 节点数 < 100

这一题看到图的问题,又看到了是否形成环,很自然的想到了用拓扑排序,首先要注意入读值表示的是有多少个节点指向该节点,还有就说划分字符串的时候要细心。 

class Solution {
public:
    bool hasCycle(string graph) {
        vector<pair<int,int>> nums;//存放所有的数组对
        find_nums(graph,nums);
        vector<vector<int>> check(max_val+1,vector<int>(1,0));
        for(auto&k:nums)//数组中,第一个为入度值,应该是指向这个数的其他数的个数,其他项为临接值
        {
            check[k.first].push_back(k.second);
            check[k.second][0]++;
        }
        //把入度为0的值存放到队列中
        queue<int> m_que;
        for(int i=1;i<max_val;++i)
        {
            if(check[i][0]==0)m_que.push(i);
        }
        int val=0;
        while(!m_que.empty())
        {
            ++val;
            int temp=m_que.front();
            m_que.pop();
            for(int i=1;i<check[temp].size();++i)
            {
                --check[check[temp][i]][0];
                if(check[check[temp][i]][0]==0)m_que.push(check[temp][i]);
            }
        }
        return val==max_val?false:true;
    }
private:
    int max_val;
    void find_nums(string graph,vector<pair<int,int>>& nums)
    {
        int n=graph.size();
        int k=graph.find(",",0),ll=0;
        while(ll!=n)//拆分
        {
            string str=graph.substr(ll,k!=-1?k-ll:n-ll);
            int t1=str.find("-");
            string str1=str.substr(0,t1);
            str.erase(0,t1+2);
            int num1=stoi(str1),num2=stoi(str);
            nums.push_back(make_pair(num1,num2));
            ll=k==-1?n:k+1;
            k=graph.find(",",ll);
            max_val=max(max_val,num2);
            max_val=max(max_val,num1);
        }
    }
    
    int stoi(string str)
    {
        int n=str.size(),ans=0;
        for(int i=0;i<n;++i)
        {
            ans+=(str[i]-'0')*pow(10.0,n-i-1);
        }
        return ans;
    }
};

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanzhe1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值