单元最短路

该博客介绍了如何解决给定n个城市和m条道路情况下的最短路径问题,从城市s到城市e的最短距离和最少时间。输入包括城市数量、道路信息和起终点,输出是最短距离和时间。示例输入和输出展示了具体的解题过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

给n个城市和联通城市间的m条道路,每条路有个距离d和走这条路所花费的时间p。给你出发城市s和终点城市e,要求输出从起点到终点的最短距离及其花费的时间,
如果有多条最短路径,输出花费时间最少的一条。

Input

首先输入n,m,城市的编号是1-n
接下来是m行,每行包含4个数字a,b,d,p,表示a城市和b城市之间有一条路,路径长度为d,所花时间为p
最后一行是两个数字s,t表示起点和终点
输入以0 0结尾
(1<n<=1000, 0<m<100000, s != t)

Output

输出 一行有两个数, 最短距离及其花费(保证数据中起点有到终点的路径)。

Sample Input

3 2
1 2 5 6
2 3 4 5
1 3
0 0

Sample Output

9 11
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 0x3f3f3f3f
using namespace std;
struct node
{
    int to,d,p;
    node *next;
}*head[1010];
int m,n;
int start,end;
bool flag[1010];
int min_d,min_p;
void build(int u,int v,int w,int t)
{

    node *q;
    q=new node;
    q->next=NULL;
    q->to=v;
    q->d=w;
    q->p=t;
    q->next=head[u]->next;
    head[u]->next=q;
}
void  dfs_search(int s,int dd,int pp)
{
    node *q;
    q=head[s]->next;
    if(dd>min_d)
    {
        return;
    }
    if(s==end)
    {
        if(dd<min_d||(dd==min_d&&min_p>pp))
        {
            min_d=dd;
            min_p=pp;
        }
        return;
    }
    while(q)
    {
        if(!flag[q->to])
        {
            flag[q->to]=1;
            dfs_search(q->to,dd+q->d,q->p+pp);
            flag[q->to]=0;
        }
        q=q->next;
    }

}
int main()
{
    int u,v,w,t;
    while(~scanf("%d%d",&n,&m)&&(m||n))
    {
        memset(flag,0,sizeof(flag));
        for(int i=0;i<1005;i++)
        {
            head[i]=new node;
            head[i]->next=NULL;
        }
        min_d=N;
        min_p=N;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d%d",&u,&v,&w,&t);
            build(u,v,w,t);
            build(v,u,w,t);
        }
        scanf("%d%d",&start,&end);
        flag[start]=1;
        dfs_search(start,0,0);
        printf("%d %d\n",min_d,min_p);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值