給你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時輸入結束。
輸出一行有兩個數, 最短距離及其花費。
3 2
1 2 5 6
2 3 4 5
1 30 0
9 11
對於 30%的資料:1對於100%的資料:1資料組數<=5,注意卡常;
分析:
本題顯然是一道最短路,但是注意在最短路的前提下在進行一次貪心,求出最小花費。
code:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7using
namespace
std;
8const
int m=1000005;9
const
int oo=1
<<30;10
intn,m,s,t;
11int
next[m],head[m],to[m],adj[m],val[m];
12int
dist[m],ans[m];
13struct
node
16}a[m];
17 priority_queue ,greater>q;
18int
tot;
19 inline int
get()
27return
res;28}
29void add(int u,int v,int w,int
p)37
void
dijkstra()
39 dist[s]=0
;40 ans[s]=0
;41 q.push((node));
42while (!q.empty()));50}
51}52return;53
}54intmain()
65 s=get(),t=get
();66
while (!q.empty()) q.pop();
67 memset(dist,0,sizeof
(dist));
68 memset(ans,0,sizeof
(ans));
69dijkstra();
70 cout<"
"72return0;
73 }
最短路 最小花費(spfa)
題目鏈結 在 n 個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後 b 收到 100 元。第一行輸入兩個正整數 n,m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個正整數...
最小花費問題 (最短路徑演算法)
在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。1 n 2000 以下m行每行輸入三個正整數x,y...
最小花費( 最短路Dijkstra或SPFA)
在 n 個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問 a 最少需要多少錢使得轉賬後 b 收到 100 元。輸入格式 第一行輸入兩個正整數 n,m,分別表示總人數和可以互相轉賬的人的對數。以下 m 行每行輸入三...