当日总结
7-2 迪杰斯特拉方法实现最短路径
分数 20
作者 liudan
单位 石家庄铁道大学
用迪杰斯特拉算法实现有向网的最短路径
输入格式:
第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的 两个点的及边上的权值,用空格间隔。最后一行输入要求路径的两个顶点。
输出格式:
输出最短路径经过的各顶点,中间用-->连接。
输入样例:
在这里给出一组输入。例如:
6 8
0 1 2 3 4 5
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
0 3
输出样例:
在这里给出相应的输出。例如:
0-->4-->3
include
include
include
include<unordered_map>
include
include
using namespace std;
const int INF=INT_MAX;
int main(){
int num_v,num_e;
cin>>num_v>>num_e;
vector
unordered_map<char,int>vi;
for(int i=0;i<num_v;i++)
{
cin>>vs[i];
vi[vs[i]]=i;
}
vector<vector
for(int i=0;i<num_v;i++)
{
adj[i][i]=0;
}
for(int i=0;i<num_e;i++)
{
char v1,v2;
int w;
cin>>v1>>v2>>w;
adj[vi[v1]][vi[v2]]=w;
}
char s,e;
cin>>s>>e;
int start=vi[s];
int end=vi[e];
vector
vector
vector
dist[start]=0;
for(int i=0;i<num_v;i++)
{
int u=-1;
int mindist=INF;
for(int j=0;j<num_v;j++)
{
if(!visited[j]&&dist[j]<mindist)
{
mindist=dist[j];
u=j;
}
}
if(u==-1)break;
visited[u]=true;
for(int v=0;v<num_v;v++)
{
if(dist[u]==INF||adj[u][v]==INF)continue;
if(!visited[v]&&dist[v]>dist[u]+adj[u][v])
{
dist[v]=dist[u]+adj[u][v];
pre[v]=u;
}
}
}
vector<char>path;
int curr=end;
while(curr!=-1)
{
path.push_back(vs[curr]);
curr=pre[curr];
}
reverse(path.begin(),path.end());
for(int i=0;i<path.size();i++)
{
if(i>0)cout<<"-->";
cout<<path[i];
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号