每次做ToperCoder碰到图论的题目都被虐的一塌糊涂,这次毛了,把最短路算法代码贴在这里存档.
1、dijkstra
-1代表没路径,path为一个数组来描述一个生成树,里面每个元素指向自己的父节点
void dijkstra(vector<vector<int> > matrix,int start,int nodenum,int* dist,int* path)
{
vector<int> tpath;
int* flag=new int(nodenum);
for(int i=0;i<=nodenum-1;i++)
{
flag[i]=0;
dist[i]=9999;
path[i]=-1;
}
flag[start]=1;
path[start]=start;
dist[start]=0;
tpath.push_back(start);
//initial
while(tpath.size()!=0)
{
int tnode=tpath[0];
tpath.erase(tpath.begin());
for(int i=0;i<=nodenum-1;i++)
{
if(matrix[tnode][i]!=-1)
{
if(dist[tnode]+matrix[tnode][i]<dist[i])
{
dist[i]=dist[tnode]+matrix[tnode][i];
path[i]=tnode;
if(flag[i]==0)
{
tpath.push_back(i);
flag[i]=1;
}
}
}
}
}
}
2、bellmanford
void bellmanford(vector<vector<int>> matrix,int start,int nodenum,int* dist,int* path)
{
int size=matrix.size();
for(int i=0;i<=size-1;i++)
{
dist[i]=9999;
path[i]=-1;
}
dist[start]=0;
path[start]=start;
for(int i=0;i<=size-2;i++)
{
for(int j=0;j<=size-1;j++)
{
for(int k=0;k<=size-1;k++)
{
if(matrix[i][j]!=-1)
{
if(dist[i]!=9999 && dist[j]<dist[i]+matrix[i][j])
{
dist[j]=dist[i]+matrix[i][j];
path[j]=i;
}
}
}
}
}
}