最短路径问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 172 Accepted Submission(s) : 61
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
(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 <cstdio> using namespace std; const int INF = 0xfffffff; int n , m ; int s , t; int dist[1010] ; int cost[1010] ; typedef struct { int d , p ; }city; city graph[1010][1010]; int vis[1010]; void init() { //cout <<"init()"<<endl; for(int i = 0; i < 1010; i ++) { for(int j = 0; j < 1010; j ++) { if(i == j){ graph[i][j].d = 0; graph[i][j].p = 0; } else { graph[i][j].d = INF; graph[i][j].p = INF; } } } for(int i = 0; i < 1010; i ++) { vis[i] = 0; dist[i] = INF; cost[i] = INF; } } void input() { //cout <<"input()"<<endl; int x , y , d , p ; for(int i = 0; i < m; i ++) { scanf("%d%d%d%d",&x,&y,&d,&p); if(graph[x][y].d > d) { graph[x][y].d = d; graph[x][y].p = p; graph[y][x].d = d; graph[y][x].p = p; } } scanf("%d%d",&s,&t); } void dijkstra() { //cout << "dijkstra()"<<endl; int u , mind , minp ; vis[s] = 1; for(int i = 1; i <= n; i ++) { dist[i] = graph[s][i].d; cost[i] = graph[s][i].p; } for(int i = 2; i <= n; i ++) { mind = INF; minp = INF; for(int j = 1; j <= n; j ++) { if(!vis[j]) { if(dist[j] < mind) { mind = dist[j]; minp = cost[j]; u = j; } else if(dist[j] == mind && cost[j] < minp){ minp = cost[j]; u = j; } } } vis[u] = 1; for(int j =1; j <= n; j ++) { if(!vis[j] && graph[u][j].d != INF) { if(dist[j] > dist[u] + graph[u][j].d) { dist[j] = dist[u] + graph[u][j].d; cost[j] = cost[u] + graph[u][j].p; } else if(dist[j] == dist[u] + graph[u][j].d) { cost[j] = cost[u] + graph[u][j].p; } } } } printf("%d %d\n",dist[t],cost[t]); } int main() { while(scanf("%d%d",&n,&m),n || m) { init(); input(); dijkstra(); } return 0; }