題目描述:給你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輸出:輸出 一行有兩個數, 最短距離及其花費。
樣例輸入:
3 21 2 5 6
2 3 4 5
1 30 0
樣例輸出:9 11
[解題思路]
構造無向圖,運用dijkstra演算法求最短路徑,在求最短路徑的同時求出最小花費(注意重邊)。
消除重邊影響的**如下
for(i=1;i<=m;i++)
}
本題目所運用的dijkstra演算法的改動版本為:
void dijkstra()
}dist[s]=0;
mon[s]=0;
while(l!=null)
/**如果有相同長度的路徑,花費選擇較少的那個
*/else if(dist[m]+map[m][j]==dist[j]&&mon[m]+cost[m][j]
所以該題的源**如下:
#include#include#include#define r 1001
#define c 1001
#define max 10000000
typedef struct node* link;
struct node;
link l;
int m,n,s,e;
int map[r][c];
int count;
int dist[r],mon[r],cost[r][c];
bool visited[r]=;
//int sum[r]=;
void insert(int x)
else
return;
}int getmin()
else
r=q;
q=q->next;
}int x=p->e;
if(p==l)
else
return x;
}}void dijkstra()
}dist[s]=0;
mon[s]=0;
while(l!=null)
/**如果有相同長度的路徑,花費選擇較少的那個
*/else if(dist[m]+map[m][j]==dist[j]&&mon[m]+cost[m][j]w||(map[s][e]==w&&cost[s][e]>c))
}scanf("%d %d",&s,&e);
dijkstra();
printf("%d %d\n",dist[e],mon[e]);
free(l);
l=null;
}}
[題目**] 九度OJ 題目1008 最短路徑問題
一題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數...
九度oj 題目1008 最短路徑問題
題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...
九度OJ 1008 最短路徑問題
題目描述 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 ...