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; }