sdut 3363 驴友计划
生活随笔
收集整理的這篇文章主要介紹了
sdut 3363 驴友计划
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description
做為一個資深驢友,小新有一張珍藏的自駕游線路圖,圖上詳細的標注了全國各個城市之間的高速公路距離和公路收費情況,現在請你編寫一個程序,找出一條出發地到目的地之間的最短路徑,如果有多條路徑最短,則輸出過路費最少的一條路徑。Input
連續T組數據輸入,每組輸入數據的第一行給出四個正整數N,M,s,d,其中N(2 <= N <= 500)是城市數目,城市編號從0~N-1,M是城市間高速公路的條數,s是出發地的城市編號,d是目的地的城市編號;隨后M行,每行給出一條高速公路的信息,表示城市1、城市2、高速公路長度、收費額,中間以空格間隔,數字均為整數且不超過500,輸入數據均保證有解。?
Output
在同一行中輸出路徑長度和收費總額,數據間用空格間隔。?
Example Input
1 4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20Example Output
3 40 #include <iostream>
#include <algorithm>
#define max 1000
#define inf 1<<29
using namespace std;
struct MGraph
{int w,m;
}edges[max][max];
int m,n,s,q;
void aaa()
{int d[max],k;int money[max],dis[max];for(int i=0;i<n;i++){d[i]=0;dis[i]=edges[s][i].w;money[i]=edges[s][i].m;}d[s]=1;for(int i=0;i<n;i++){int min1=inf;for(int j=0;j<n;j++)if(d[j]==0&&dis[j]<min1){min1=dis[j];k=j;}d[k]=1;for(int j=0;j<n;j++){if(d[j]==0&&edges[k][j].w+dis[k]<dis[j]){dis[j]=edges[k][j].w+dis[k];money[j]=edges[k][j].m+money[k];}else if(d[j]==0&&edges[k][j].w+dis[k]==dis[j]){dis[j]=edges[k][j].w+dis[k];money[j]=min(edges[k][j].m+money[k],money[j]);}}}cout<<dis[q]<<' '<<money[q]<<endl;
}
int main()
{int k;cin>>k;while(k--){cin>>n>>m>>s>>q;int a,b,c,d;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i==j)edges[i][j].w=edges[i][j].m=0;else{edges[i][j].w=edges[j][i].w=inf;edges[i][j].m=edges[j][i].m=inf;}for(int i=0;i<m;i++){cin>>a>>b>>c>>d;edges[a][b].w=edges[b][a].w=c;edges[a][b].m=edges[b][a].m=d;}aaa();}return 0;
}/***************************************************
User name: YT1658506207邵雪源
Result: Accepted
Take time: 0ms
Take Memory: 184KB
Submit time: 2017-08-11 17:15:10
****************************************************/
總結
以上是生活随笔為你收集整理的sdut 3363 驴友计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sdut 2141 BFS(用邻接矩阵和
- 下一篇: POJ 1845