L2 001 緊急救援 (dijkstra演算法)

2021-08-14 20:27:23 字數 3184 閱讀 9027

時間限制

200 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者 陳越

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。

輸入格式:

輸入第一行給出4個正整數n、m、s、d,其中n(2<=n<=500)是城市的個數,順便假設城市的編號為0~(n-1);m是快速道路的條數;s是出發地的城市編號;d是目的地的城市編號。第二行給出n個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨後的m行中,每行給出一條快速道路的資訊,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。

輸出格式:

第一行輸出不同的最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從s到d的路徑中經過的城市編號。數字間以空格分隔,輸出首尾不能有多餘空格。

輸入樣例:

4 5 0 3

20 30 40 10

0 1 1

1 3 2

0 3 3

0 2 2

2 3 2

輸出樣例:
2 60

0 1 3

// 第一種,借用了dijkstra框架

#include #include #include #include #define inf 1 << 30

using namespace std;

int weight[500] = ; // 每個城市的救援隊數量

int totweight[500] = ;

int pathamount[500] = ;

int g[510][510];

int path[510];

int dis[510];

int vis[510];

int n, m, s, d;

int num;

void dijkstra(int s)

} for (int i = 0; i < n - 1; i++)

}vis[u] = true;

for (int j = 0; j < n; j++)

else if (dis[u] + g[u][j] == dis[j])}}

} }}int main()

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

for (int j = 0; j < n; j++)

g[i][j] = inf;

for (int i = 0; i < m; i++) }

dijkstra(s);

int num = 0, cur = d;

while (cur != s)

re[num++] = s;

cout << pathamount[d] << " " << totweight[d] << endl;

for (int i = num - 1; i > 0; i--)

cout << re[i] << " ";

cout << re[0];

return 0;

}

// 第二種,使用了dfs,比第一種容易理解,可惜超時

#include #include #include #include using namespace std;

struct node ;

// 為了方便,定義為全域性變數

int minlen = 1 << 30; // 最短路徑的長度

int minrodeamount = 1; // 最短路徑的數量

int maxpeopleamount = -1; // 最多救援隊數量

int totallen = 0; // 目前走過經過的長度

int totalpeople = 0;// 目前召集的救援隊的數量

int visited[500] = ; // 城市訪問標記

int weight[500] = ; // 每個城市的救援隊數量

int path[500]; // 訪問路徑

int min_path[500]; // 最短路徑

int minl[500][250000] = ;

int min_depth = 0;

int depth = 0; // 訪問深度

vector< vector > g(510); // 城市的路徑

int n, m, s, d;

int num;

int start, end;

void dfs(int v)

else if (minlen == totallen)

}return;

} path[depth++] = v;

for (int i = 0; i < g[v].size(); i++)

else

minl[g[v][i].end][totallen + g[v][i].length] = totalpeople + weight[g[v][i].end];

totallen += g[v][i].length;

totalpeople += weight[g[v][i].end];

visited[v] = 1;

dfs(g[v][i].end);

totallen -= g[v][i].length;

totalpeople -= weight[g[v][i].end];

visited[v] = 0;

depth--;

}} return;

}int main()

for (int i = 0; i < m; i++)

}totalpeople += weight[s];

dfs(s);

if (min_depth > 0)

} return 0;

}

L2 001 緊急救援

這道題就是一道最短路 dijkstra演算法 將模板稍作修改就行了,就是再另外加乙個記錄路線條數的陣列 即當路的長度與下乙個需要判斷的 節點的長度相等時路線就相加 和乙個記錄每個節點在最短路基礎上的車的總數量的陣列,然後就ok了,如下 include include include define m...

L2 001 緊急救援

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入格式 ...

L2 001 緊急救援

l2 001.緊急救援 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可...