最短路(Dijkstra)

来源:互联网 发布:js根据class隐藏div 编辑:程序博客网 时间:2024/04/28 19:57

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离
有多条路线,则输出花费最少的。

输入要求:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数
s,t;起点s,终点t。(1

#include<bits/stdc++.h>using namespace std;int n,m;int map_len[1005][1005],map_time[1005][1005];int vis[1005],cost_len[1005],cost_time[1005];int minnum;void dijkstra(int s,int t){    int i,j,min,pos;    memset(vis,0,sizeof(vis));    cost_len[s]=0;    cost_time[s]=0;    vis[s]=1;    for (int  i=0;i<n;i++)    {        cost_len[i]=map_len[s][i];        cost_time[i]=map_time[s][i];    }    for (int i=1;i<n;i++)    {        minnum=100000;        for (int j=0;j<n;j++)        {            if (cost_len[j]<minnum&&!vis[j])            {                pos=j;                minnum=cost_len[j];            }        }            vis[pos]=1;            for (int j=0;j<n;j++)            {                if(cost_len[pos]+map_len[pos][j]<cost_len[j] && !vis[j])                {                    cost_len[j] = cost_len[pos]+map_len[pos][j];                    cost_time[j] = cost_time[pos]+map_time[pos][j];                }                else if(cost_len[pos]+map_len[pos][j]==cost_len[j] && !vis[j])//路程相同的情况下找时间少的                {                    if(cost_time[pos]+map_time[pos][j]<cost_time[j])                    {                        cost_time[j] = cost_time[pos]+map_time[pos][j];                    }                }            }    }}int main(){    int a,b,d,p;    int s,t;    cin>>n>>m;    for (int  i =0;i<1005;i++)    {        for (int j=0;j<1005;j++)        {            map_len[i][j]=map_time[i][j]=100000;        }        map_len[i][i]=map_time[i][i]=0;    }    for (int i=0;i<m;i++)    {        cin>>a>>b>>d>>p;        a-=1;b-=1;        if (d<map_len[a][b])        {            map_len[a][b]=map_len[b][a]=d;            map_time[a][b]=map_time[b][a]=p;        }    }    cin>>s>>t;    s-=1;t-=1;    dijkstra(s,t);    cout<<cost_len[t];    cout<<cost_time[t];    return 0;}
原创粉丝点击