sdutoj3363 数据结构实验之图论七:驴友计划 (暴力最短路+限制条件)

来源:互联网 发布:北通 手柄 知乎 编辑:程序博客网 时间:2024/04/30 09:55

数据结构实验之图论七:驴友计划

Time Limit: 1000MS Memory limit: 65536K

题目描述

做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。

输入

连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。 

输出

在同一行中输出路径长度和收费总额,数据间用空格间隔。 

示例输入

14 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 20

示例输出

3 40

就是暴力最短路加上了一个限制条件 就是模板啊23333......

///ACcode#include <bits/stdc++.h>using namespace std;const int maxn=501;const int BIG=103456789;int Dis[maxn][maxn]; /// 两点距离int Fee[maxn][maxn]; /// 两点路费void MinRoad(int n){    int i,j,k;    for (k=0; k<n; k++) ///0到n暴力三个for 找最小    {        for (i=0; i<n; i++)        {            for (j=0; j<n; j++)            {                if(Dis[i][j] > Dis[i][k]+Dis[k][j]) /// 更新找最小的                {                    Dis[i][j] = Dis[i][k]+Dis[k][j];                    /**Dis[j][i] = Dis[i][k]+Dis[k][j];*/                    Fee[i][j] = Fee[i][k]+Fee[k][j];                    /**Fee[j][i] = Fee[i][k]+Fee[k][j];*/                }                else if (Dis[i][j] == Dis[i][k]+Dis[k][j]) ///如果相等比较路费fee                {                    if (Fee[i][j] > Fee[i][k]+Fee[k][j])                    {                        Fee[i][j] = Fee[i][k]+Fee[k][j];                        /**Fee[j][i] = Fee[i][k]+Fee[k][j];*/                    } /**内的语句可以省略 思考为什么 */                }            }        }    }}int main(){    int i,j,n,m,s,d;    int city1,city2,dis,fee; ///城市 1 2 距离 费用    int t;    cin>>t;    while (t--)    {        cin>>n>>m>>s>>d;        for(i=0; i<n; i++)        {            for (j=0; j<n; j++)            {                Dis[i][j]=BIG;                Fee[i][j]=BIG;            }        } ///初始化为最大值 表示 "不通"        for (i=1; i<=m; i++)        {            cin>>city1>>city2>>dis>>fee;            if (Fee[city1][city2] > fee) /// 防止重边 重边留最小的(fee)            {                Fee[city1][city2]=fee;                Fee[city2][city1]=fee;            }            if (Dis[city1][city2] > dis) /// 同上 (dis)            {                Dis[city1][city2]=dis;                Dis[city2][city1]=dis;            }        }        MinRoad(n);        cout<<Dis[s][d]<<" "<<Fee[s][d]<<endl; /// 最小路径 路费    }    return 0;}


1 0
原创粉丝点击