当日总结

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;
vectorvs(num_v);
unordered_map<char,int>vi;
for(int i=0;i<num_v;i++)
{
cin>>vs[i];
vi[vs[i]]=i;
}
vector<vector> adj(num_v,vector(num_v,INF));
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];
vectordist(num_v,INF);
vectorvisited(num_v,false);
vectorpre(num_v,-1);
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;

}

posted @ 2025-12-16 23:48  lagranSun  阅读(2)  评论(0)    收藏  举报