时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:3219
解决:963
- 题目描述:
-
给你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
MYCode:
#include<iostream>
#include<cstring> #include<cstdio> #include<queue> using namespace std; #define MAX 1010 #define inf 100000000 struct node { int dt; int ct; int id; bool operator<(node t)const { if(dt != t.dt) return dt > t.dt; return ct > t.ct; } }; priority_queue<node> q; struct edge { int v; int w; int c; int next; } E[2 * 100010]; int head[MAX]; int num; int dist[MAX]; int cost[MAX]; bool vis[MAX]; int n; int src, des; void init() { memset(head, -1, sizeof(head)); num = 0; int i; for(i = 1; i <= n; i++) { dist[i] = inf; cost[i] = inf; } memset(vis, 0, sizeof(vis)); } void add(int s, int t, int w, int c) { E[num].v = t; E[num].w = w; E[num].c = c; E[num].next = head[s]; head[s] = num++; E[num].v = s; E[num].w = w; E[num].next = head[t]; E[num].c = c; head[t] = num++; } void dijkstra() { while(!q.empty())q.pop(); dist[src] = 0; cost[src] = 0; node bg; bg.dt = 0; bg.ct = 0; bg.id = src; q.push(bg); while(!q.empty()) { node p = q.top(); q.pop(); int u = p.id; if(vis[u])continue; vis[u] = true; int v; for(int i = head[u]; i != -1; i = E[i].next) { int v = E[i].v; //cout<<"show"<<u<<" "<<E[i].v<<" "<<E[i].w<<" "<<E[i].c<<endl; //cout<<dist[v]<<" "<<dist[u]+E[i].w<<" "<<cost[v]<<" "<<cost[u]+E[i].c<<endl; if((dist[v] > dist[u] + E[i].w) || (dist[v] == dist[u] + E[i].w && cost[v] > cost[u] + E[i].c)) { dist[v] = dist[u] + E[i].w; cost[v] = cost[u] + E[i].c; //cout<<"change "<<dist[v]<<" "<<cost[v]<<endl; node tp; tp.id = v; tp.dt = dist[v]; tp.ct = cost[v]; q.push(tp); } } } } int main() { int m; while(scanf("%d%d", &n, &m) != EOF) { if(n == 0 && m == 0) break; init(); int i; int s, t, w, c; for(i = 1; i <= m; i++) { scanf("%d%d%d%d", &s, &t, &w, &c); add(s, t, w, c); add(t, s, w, c); } scanf("%d%d", &src, &des); dijkstra(); cout << dist[des] << " " << cost[des] << endl; } } |
在最短路的基础上稍作修改。