import'dart:io';classVertex{Stringlabel;boolisInTree;Vertex(this.label){isInTree=false;}}classDistPar{intdistance;intparentVert;DistPar(this.parentVert,this.distance);}classGraphPath{finalintmaxVerts=20;finalintINFINITY=1000000;List<Vertex>vertexList;List<List<int>>adjMat;intnVerts;intnTree;intcurrentVert;List<DistPar>sPath;intstartToCurrent;GraphPath(){nTree=0;currentVert=0;startToCurrent=0;nVerts=0;vertexList=newList<Vertex>(maxVerts);adjMat=newList.generate(maxVerts,(inti)=>newList(maxVerts));for(inti=0;i<maxVerts;i++){for(intj=0;j<maxVerts;j++){adjMat[i][j]=INFINITY;}}sPath=newList<DistPar>(maxVerts);}voidaddVertex(Stringlabel){vertexList[nVerts++]=newVertex(label);}voidaddEdge(intstart,intend,intweight){adjMat[start][end]=weight;}voidpath(){intstartTree=0;vertexList[startTree].isInTree=true;nTree=1;for(inti=0;i<nVerts;i++){inttempDist=adjMat[startTree][i];sPath[i]=newDistPar(startTree,tempDist);}while(nTree<nVerts){intindexMin=getMin();intminDist=sPath[indexMin].distance;if(minDist==INFINITY){stdout.writeln('There are unreachable verices');break;}else{currentVert=indexMin;startToCurrent=sPath[indexMin].distance;}vertexList[currentVert].isInTree=true;nTree++;adjust_sPath();}displayPath();nTree=0;for(inti=0;i<nVerts;i++){vertexList[i].isInTree=false;}}intgetMin(){intminDist=INFINITY;intindexMin=0;for(inti=1;i<nVerts;i++){if(!vertexList[i].isInTree&&sPath[i].distance<minDist){minDist=sPath[i].distance;indexMin=i;}}returnindexMin;}voidadjust_sPath(){intcolumn=1;while(column<nVerts){if(vertexList[column].isInTree){column++;continue;}intcurrentToFringe=adjMat[currentVert][column];intstartToFringe=startToCurrent+currentToFringe;intsPathDist=sPath[column].distance;if(startToFringe<sPathDist){sPath[column].parentVert=currentVert;sPath[column].distance=startToFringe;}column++;}}voiddisplayPath(){for(inti=0;i<nVerts;i++){stdout.write('${vertexList[i].label} = ');if(sPath[i].distance==INFINITY){stdout.write('inf');}else{stdout.write(sPath[i].distance);}Stringparent=vertexList[sPath[i].parentVert].label;stdout.write('($parent) ');}stdout.writeln();}}voidmain(){GraphPathgraphPath=newGraphPath();graphPath.addVertex('A');// 0graphPath.addVertex('B');// 1graphPath.addVertex('C');// 2graphPath.addVertex('D');// 3graphPath.addVertex('E');// 4graphPath.addEdge(0,1,50);// AB 50graphPath.addEdge(0,3,80);// AD 80graphPath.addEdge(1,2,60);// BC 60graphPath.addEdge(1,3,90);// BD 90graphPath.addEdge(2,4,40);// CE 40graphPath.addEdge(3,2,20);// DC 20graphPath.addEdge(3,4,70);// DE 70graphPath.addEdge(4,1,50);// EB 50stdout.writeln('Shortest Path: ');graphPath.path();stdout.writeln();}