#include #include
using
namespace
std;
intconst max = 505
;int
const inf = 0x3fffffff
;int
mp[max][max], val[max], path[max], dis[max], re[max], totval[max], pathnum[max]; mp地圖
bool
vis[max];
intn, m, s, d;
void dijkstra(int v0) //
v0出發地的城市編號
}for(int i = 0; i < n - 1; i++) //
這裡是n-1的原因:v0已經處理過了,只需要n-1次,所有的節點就會都被拿出來。
}vis[u] = true; //
訪問ufor(int j = 0; j < n; j++)
else
if(dis[u] + mp[u][j] ==dis[j]) }}
}}
}int
main()
dijkstra(s);
//拿到需要的資料了,如路徑,條數
int num = 0, cur =d;
while(cur != s) //
將path中逆序的路徑順序放到re陣列中去。
re[num ++] = s; //
起點放進順序路徑中
printf("
%d %d\n
", pathnum[d], totval[d]); //
輸出路的條數,支援隊伍的數量
for(int i = num - 1; i > 0; i--)
printf(
"%d
", re[i]);
printf(
"%d\n
", re[0
]);}
dijkstra演算法比較複雜,看了好一陣才算完全弄明白,如果不了解演算法就來看**,真的很蛋疼,應該先完全了解dijkstra演算法,然後知道這類問題的不同情況,以下列出,然後根據套路來看**,就會容易很多
求最短路徑的條數
counts[s] = 1;
如果找到更短路: count[w] = count[v];
如果找到等長路:count[w] = count[v] + count[w]
要求邊數最少的最短路:
counts[0];
如果找到更短路:count[w] = count[v] + 1
如果找到等長路: count[w] = count[v] + 1 //這是抄的mooc上變得,個人覺得這裡應該是
if(count[v]+1count[w] = count[v]+1
L2 001 緊急救援
這道題就是一道最短路 dijkstra演算法 將模板稍作修改就行了,就是再另外加乙個記錄路線條數的陣列 即當路的長度與下乙個需要判斷的 節點的長度相等時路線就相加 和乙個記錄每個節點在最短路基礎上的車的總數量的陣列,然後就ok了,如下 include include include define m...
L2 001 緊急救援
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入格式 ...
L2 001 緊急救援
l2 001.緊急救援 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可...