每次找最短路径的方法是直接扫描
思想是每次从未被收录的点中找到距源点最近的点收录进去,然后去更新与新收录点的临界点与源点的最短距离。
测试样例
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <map>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
const int N=6;
const int IN= (1<<30);
int G[N+1][N+1];
int dist[7];//最短距离
int path[7];//路径
int Final[7];//标记是否收录
queue<int> q;
stack<int> s;
void dijstra()
{
Final[1] = 1;
for(int i=1; i<=N; i++)
{
if(G[1][i]!=IN)
{
path[i]=1;
dist[i]=G[1][i];
}
else
dist[i] = IN;
}
while(1)
{
int Min = IN,Minv;
for(int i=1; i<=N; i++)
if(!Final[i])
{
if(dist[i]<Min)
{
Min = dist[i];
Minv = i;
}
}
if(Min==IN)
break;
else
{
Final[Minv] = 1;
for(int i=1; i<=N; i++)
if(!Final[i] && dist[Minv]+G[Minv][i] < dist[i])
{
dist[i] = dist[Minv]+G[Minv][i];
path[i] = Minv;
}
}
}
}
int main()
{
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
G[i][j] = IN;
int edagenum;
int v,w;
cin >> edagenum;
while(edagenum--)
{
cin >> v >> w;
cin >> G[v][w];
}
memset(Final,0,sizeof(Final));
dist[1] = 0;
path[1] = 0;
dijstra();
for(int i=1;i<=6;i++)
cout<<dist[i]<<endl;
for(int i=2;i<=6;i++)
{
int j=i;
while(j)
{
s.push(j);
j = path[j];
}
while(!s.empty())
{
cout<<s.top()<<"->";
s.pop();
}
cout<<endl;
}
return 0;
}
结果如下