// Learn more about F# at http://fsharp.net // See the 'F# Tutorial' project for more help. module File1 open System.Windows.Forms open System.Collections.Generic type Loc = |A|B|C|D let path_key a b = if a<b then (a,b) else (b,a) let path_key_ls (ls:Loc list) = (ls.Head,A) let pathData =[A,B,4;A,C,1;B,C,1;B,D,1;C,D,4] let path_Dis_map = pathData |>List.map (fun (a,b,c)->((path_key a b)),c) |>Map.ofList path_Dis_map |> Map.toList |>printfn "%A" //let dict = new Dictionary<string, string>() let path_Dis_map2 = new Dictionary< Loc*Loc , int>() //Map.tryFind let path_map_query ls map1= match ls with |head::val1::tail-> if ( Map.containsKey (A,head) map1) then map1.[(A,head)] else System.Int32.MaxValue |_->System.Int32.MaxValue let rec path_cdis ls= match ls with |head::a::tail-> let dis1 = path_Dis_map.[path_key head a] dis1 + path_cdis(a::tail) |_->0 printfn "dis = %d %d" (path_cdis [D;C;B;A]) (path_map_query [D;C;B;A] path_Dis_map) let fileterme crr value= match value with | (a,b,c) when a=crr -> Some(b) | (a,b,c) when b=crr ->Some(a) | _ ->None let findway (ls:Loc list) = List.choose (fileterme ls.Head) pathData |> List.filter (fun x-> not ( List.exists (fun i->i=x) ls)) let start1 =[[A]] let rec work2 (start,pathmaps)= let once = List.collect (fun (ls)-> let firstList = ls//List.head start let ways = findway firstList match ways with |[] -> [] |_-> let ends = List.map (fun x ->x::ls) ways ends ) start let map1 = pathmaps let Mapme = once|> List.fold (fun (acc:Map<(Loc*Loc),int>) (ls:Loc list)-> let k=A,ls.Head let v= path_cdis ls match (Map.tryFind k acc) with |Some n-> if v< n then Map.add k v acc else acc |_->Map.add k v acc ) map1 // //Mapme|>printf "Map me %A" List.filter (fun x-> match x with |D::tail -> printfn "Find the way %A = %d" x (path_cdis x) false |_->true ) once |>printfn "%A" //裁剪路径 let once3 = List.filter (fun (ls:Loc list)-> let k=A,ls.Head let v= path_cdis ls match (Map.tryFind k Mapme) with |Some n-> if v <= n then true else false |_->true ) once |> List.filter (fun (x:Loc list)-> not (D = x.Head)) //once3 |> printfn ">>>>Left is %A" once3,Mapme let rec work1 (start,map) = match start with |[] ->() |_-> let data = work2 (start,map) work1 data work1 (start1,path_Dis_map) |> printfn ">>>%A" [<EntryPoint>] let main argv = printfn "%A" argv 0 // return an integer exit code