安排航班
-
输入: flights={{{1,1000},{2,2000}},{2,500},{1,500}}
-
解析:
从0号到1号1000,从0号到2号2000
从1号到2号500,从2号到1号500
[节点、经停次数,最短路费] -
代码:
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]); } } }
}