最短路径1

Posted 肥宅Sean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径1相关的知识,希望对你有一定的参考价值。


题目描述

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

输入描述:

输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。 (1<n<=1000, 0<m<100000, s != t)

输出描述:

输出 一行有两个数, 最短距离及其花费。

输入

3 2

1 2 5 6

2 3 4 5

1 3

0 0

输出

9 11


解析:

用深搜咯~


#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct Node{
    int e, l, co;
    Node(int ee=1, int ll=0,int cc=0) {
        e = ee; l = ll; co = cc;
    }
};
vector<Node> v[1000];
int len = 1<<30;
int cost;
int s,t;
bool visited[1000];
void DFS(int now, int path,int c){
    if (visited[now])
        return;
    if (now == t) {
        if (path < len) {
            len = path;
            cost = c;
        }
        return;
    }
    visited[now] = true;
    for (int i = 0;i < v[now].size();++i){
        if (path+v[now][i].l < len)
            DFS(v[now][i].e, path+v[now][i].l, c+v[now][i].co);
    }
    visited[now] = false;
}

int main(){
    int n,m;
    int first = 1;
    while (cin>> n>> m && n) {
        if(first == 1) {
            first = 0;
        } else {
            cout<<endl;
        }
        for (int i=0; i < n; ++i) {
            v[i].clear();
        }
        len = 1<<30;
        memset(visited, false, sizeof(visited));
        int b,e,l,c;
        for(int i=0;i<m;++i) {
            cin>> b>> e>> l>> c;
            v[b-1].push_back(Node(e-1, l ,c));
            v[e-1].push_back(Node(b-1, l, c));
        }
        cin>>s >> t;
        s-=1; t-=1;
        DFS(s, 0, 0);
        cout << len <<" "<< cost;
    }
}