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 |
|---|