安排航班

安排航班

  1. 输入: flights={{{1,1000},{2,2000}},{2,500},{1,500}}

  2. 解析:
    从0号到1号1000,从0号到2号2000
    从1号到2号500,从2号到1号500
    [节点、经停次数,最短路费]

  3. 代码:
    class ArrangFlights
    {
    //flights={{{1,1000},{2,2000}},{2,500},{1,500}}
    // 0 1 2
    public class Flights
    {
    public int FromPoint { get; set; }

        public int ToPoint { get; set; }
    
        public int Money { get; set; }
    }
    
    public void MainFlights()
    {
        List<Flights> listFights = new List<Flights>();
        List<Flights> flOp = new List<Flights>();
        Flights flights = new Flights();
        flights.FromPoint = 0;
        flights.ToPoint = 1;
        flights.Money = 1000;
        listFights.Add(flights);
        flights = new Flights();
        flights.FromPoint = 0;
        flights.ToPoint = 2;
        flights.Money = 2000;
        listFights.Add(flights);
        flights = new Flights();
        flights.FromPoint = 1;
        flights.ToPoint = 3;
        flights.Money = 500;
        listFights.Add(flights);
        flights = new Flights();
        flights.FromPoint = 2;
        flights.ToPoint = 1;
        flights.Money = 500;
        listFights.Add(flights);
        OptimalFl(0, 2, listFights, ref flOp);
        //排序(冒泡),找出最优
        for(int i=0;i< flOp.Count; i++)
        {
            for(int j = 0; j < flOp.Count - i-1; j++)
            {
                if (flOp[j].Money > flOp[j + 1].Money)
                {
                    Flights flight = new Flights();
                    flight = flOp[j];
                    flOp[j] = flOp[j + 1];
                    flOp[j + 1] = flight;
                }
            }
        }
        Console.WriteLine(flOp[0].Money);
    
    }
    
    private void OptimalFl(int FromPoint, int ToPoint, List<Flights> listFights, ref List<Flights> flOp)
    {
        for (int i = 0; i < listFights.Count; i++)
        {
            if(listFights[i].FromPoint == FromPoint)   
            {
                int money = listFights[i].Money;
                int fromPoint = listFights[i].FromPoint;
                for (int j=0;j< flOp.Count; j++)
                {
                    if(flOp[j].ToPoint== listFights[i].FromPoint)//如果找到可走的路径:1、money改变;2、fromPoint 改变
                    {
                        money += flOp[j].Money;
                        fromPoint = flOp[j].FromPoint;
                        flOp.Remove(flOp[j]);
                        
                    }
                  
    
                }
                Flights flis = new Flights();
                flis.Money = money;
                flis.FromPoint = fromPoint;
                flis.ToPoint = listFights[i].ToPoint;
                flOp.Add(flis);
            }
           
    
        }
    
        FromPointList( ToPoint, listFights, ref flOp);
    
    
    }
    
    private void FromPointList(int ToPoint,  List<Flights> listFights, ref List<Flights> flOp)
    {
        for(int i=0;i< flOp.Count; i++)
        {
            for (int j = 0; j < listFights.Count; j++)
            {
                if (flOp[i].ToPoint == listFights[j].FromPoint && flOp[i].ToPoint!= ToPoint)
                     //判断依据:1、是否能找到可走路径的同时,2、flOp中的到达的地方是否为目的地
                {
                    OptimalFl(flOp[i].ToPoint, ToPoint, listFights, ref flOp);
                }
            }
        }
    
        for (int i = 0; i < flOp.Count; i++)//flOp[i]两种可能:1、flop目的地不为当前目的地:例如:0->1,1->3。2、可能有两个或两个以上的方案
        {
            if(flOp[i].ToPoint != ToPoint)
            {
                flOp.Remove(flOp[i]);
            }
        }
    
    
    }
    

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值