最短路径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;
}
}
以上是关于最短路径1的主要内容,如果未能解决你的问题,请参考以下文章