C#

1205 메모

버스창문 2022. 12. 5. 17:08
static void Main()
        {
            int v = 5; //정점의 개수
            int e = 6; //간선의 개수
            eData[] eDatas = new eData[e]; //간선 데이터들
            vData[] vDatas = new vData[v]; //정점 데이터들

            int startP = 1; //시작점

            for (int i = 0; i < v; i++)
            {
                vDatas[i] = new vData(i + 1);
            }
            eDatas[0] = new eData(5, 1, 1);
            eDatas[1] = new eData(1, 2, 2);
            eDatas[2] = new eData(1, 3, 3);
            eDatas[3] = new eData(2, 3, 4);
            eDatas[4] = new eData(2, 4, 5);
            eDatas[5] = new eData(3, 4, 6);

            for (int i = 0; i < e; i++)
            {
                vDatas[eDatas[i].startP - 1].linesList.Add(eDatas[i]);
            }

            for (int i = 0; i < v; i++)
            {
                if (i + 1 == startP)
                {
                    Console.WriteLine("0");
                }
                else
                {
                    List<rData> routesList = new List<rData>();
                    int nextLineCnt = vDatas[startP - 1].linesList.Count;
                    vData temp = vDatas[startP - 1];
                    List<int> routeNum = new List<int>();
                    int cost = 0;
                    while (nextLineCnt != 0)
                    {
                        foreach (var a in temp.linesList)
                        {
                            routeNum.Add(a.endP);
                            cost += a.cost;
                            if (a.endP == v)
                            {
                                rData route = new rData();
                                route.route = routeNum;
                                route.cost = cost;
                                routesList.Add(route);
                            }
                            else
                            {
                                temp = vDatas[a.endP - 1];
                                nextLineCnt = temp.linesList.Count;
                            }
                            // a = 시작 정점에서 연결된 라인(간선 데이터)
                            // a 의 끝점을 이용해서 그 끝점을 vData에서 찾아서 그 vData의 linesList를 이용해서 또 그 다음을 찾고 ~~
                            // 이런 경로들을 정리해서 모든 경로에 대해 가중치를 더한다음 가중치를 비교해서 가장 작은애를 최종경로로
                        }
                    }
                }
            }
        }
public List<rData> RouteMaker(int vCnt, vData v, int cost, List<int> routeNum, List<rData> routesList) // vCnt = 목표 정점 번호 , v = 정점 , cost = 가중치 , routeNum = 경로(int)
        {
            if (routeNum == null)
            {
                routeNum = new List<int>();
            }
            if (v.linesList.Count != 0)
            {
                foreach (var a in v.linesList)
                {
                    routeNum.Add(a.endP);
                    cost += a.cost;
                    if (a.endP == vCnt)
                    {
                        rData route = new rData();
                        route.route = routeNum;
                        route.cost = cost;
                        routesList.Add(route);
                    }
                    else
                    {

                    }
                    // a = 시작 정점에서 연결된 라인(간선 데이터)
                    // a 의 끝점을 이용해서 그 끝점을 vData에서 찾아서 그 vData의 linesList를 이용해서 또 그 다음을 찾고 ~~
                    // 이런 경로들을 정리해서 모든 경로에 대해 가중치를 더한다음 가중치를 비교해서 가장 작은애를 최종경로로
                }
                return RouteMaker(vCnt, v, cost, routeNum, routesList);
            }
            else
            {
                return routesList;
            }
        }
    class eData //간선 데이터
    {
        public int startP; //시작점
        public int endP; //끝점
        public int cost; //가중치
        public eData(int u, int v, int w)
        {
            this.startP = u;
            this.endP = v;
            this.cost = w;
        }
    }
    class vData //정점 데이터
    {
        public int startP;
        public List<eData> linesList;
        public vData(int startP)
        {
            this.startP = startP;
            this.linesList = new List<eData>();
        }
    }
    class rData //경로 데이터
    {
        /*
        경로 List int
        가중치 int
        클래스
        */
        public List<int> route;
        public int cost;
        public rData()
        {
            this.route = new List<int>();
        }
    }

아주 미르스띤한 방법이고 이렇게하는거 아님

'C#' 카테고리의 다른 글

1211 다익스트라  (0) 2022.12.11