計蒜客 電能傳輸 最短路

2021-09-03 00:16:57 字數 2613 閱讀 8444

在嘟嘟生活的王國有 n 座城市,某些城市之間有傳輸電能的線路。在某條線路傳輸電能是會有損耗的,某乙個城市在某一時間只可以向另外乙個城市傳輸電能。已知在城市 s 存在 m 千瓦時電能,求將這些電能都傳輸到城市 t ,至少需要損耗多少電能。

輸入包含多組測試資料,對於每組測試資料:

第一行包含乙個整數 n ( 0 < n ≤ 50000 ) 。

接下來輸入包含 n 部分,對於第 i ( 1 ≤ i ≤ n )部分:第一行包含乙個整數 num ( num ≤ 50 ) ,表示城市 i 可以向 num 個城市傳輸電能;接下來 num 行每行包含兩個整數 x y ( 1 ≤ x ≤ n ; x != i ; 0 ≤ y ≤ 100 ) ,表示城市 i 可以向城市 x 傳輸電能,在傳輸時將會損失 y% 的電能。

最後一行包含三個整數 s t m ( 1 ≤ s,t ≤ n ; 1 ≤ m ≤ 1000000 ) 。

對於每組測試資料,如果城市 s 不能向城市 t 傳輸電能,則輸出 "impossible!" ;否則輸出乙個小數,表示損失電能的最小量,結果保留兩位小數。

5

22 20

3 40

23 90

4 50

22 40

4 90

15 80

01 5 1000

920.00

這是一道最短路問題,用dis[i]存s到t的最小損失,再用乙個陣列把傳送到每個地點的電能存下來,以便計算下乙個的損失,然後跑一遍最短路就行了。

dijkstra:

#include #include #define n 50000

const double inf = 99999999;

int vis[n + 10], f[n + 10], n, cnt;

double dis[n + 10], arr[n + 10], minn;

struct edge e[n * 50 + 10];

void add(int u, int v, int w)

; f[u] = cnt;

}void dijkstra(int s, int m)}}

}int main()

for (int i = 1; i <= n; i++)

}scanf("%d%d%d", &s, &t, &m);

dijkstra(s, m);

if (dis[t] < inf)

printf("%.2f\n", dis[t]);

else printf("impossible!\n");

}return 0;

}

dijkstra佇列優化:

#include #include #include #include #define n 50000

using namespace std;

typedef pair pii;

const double inf = 99999999;

int vis[n + 10], f[n + 10], n, cnt;

double dis[n + 10], arr[n + 10], minn;

struct edge e[n * 50 + 10];

void add(int u, int v, int w)

; f[u] = cnt;

}void dijkstra(int s, int m)}}

}int main()

for (int i = 1; i <= n; i++)

}scanf("%d%d%d", &s, &t, &m);

dijkstra(s, m);

if (dis[t] < inf)

printf("%.2f\n", dis[t]);

else printf("impossible!\n");

}return 0;

}

spfa: 

#include #include #include #include #define n 50000

using namespace std;

const double inf = 99999999;

int vis[n + 10], f[n + 10], n, cnt;

double dis[n + 10], arr[n + 10], minn;

struct edge e[n * 50 + 10];

void add(int u, int v, int w)

; f[u] = cnt;

}void spfa(int s, int m)}}

}}int main()

for (int i = 1; i <= n; i++)

}scanf("%d%d%d", &s, &t, &m);

spfa(s, m);

if (dis[t] < inf)

printf("%.2f\n", dis[t]);

else printf("impossible!\n");

}return 0;

}

計蒜客 熱愛工作的蒜蒜(最短路)

題目鏈結 time limit 1000ms memory limit 262144k 眾所周知,蒜蒜是一名熱愛工作的好員工,他覺得時間就是金錢,做事情總是爭分奪秒。這天晚上,蒜蒜乙個人去吃晚飯。不巧的是,吃完飯以後就開始下雨了,蒜蒜並沒有帶雨傘出來。但是蒜蒜熱愛工作,工作使他快樂,他要盡快趕回去寫...

計蒜客 最短路習題 聖誕樹

許久未更新,今天做到一道有意思的題目,先上圖,然後細說 這道題大體意思是給定一張無向圖,其邊權為正,要你求出總代價最小的生成樹,生成樹上 每條邊 v e 的代價為 w e s j w e 為邊 i,j 的權值,s j 是 對於 j 節點所在子樹的節點 數總和。題解 該題看起來是最小生成樹的題目,實際...

計蒜客 18018 熱愛工作的蒜蒜 最短路 dp

蒜蒜要從1 n,中間有地下的路和地上的路,地下的路長度都為1,且不會被淋,地上的路長度有權值,問從1 n在距離不超過l的情況下,使得淋雨的路程最少 定義dp i j 表示在走了j條地下的路的情況下從1到i的最短路,然後就是最短路了 只不過push的時候還要記下j的值 31 struct node 3...