題目中已經明確要求最短路,因此最短路演算法也就不可或缺
int map[500][500];
int u, v, w;
for(int i = 0; i != m; ++i)
struct nodearr[500];
int u, v, w;
for(int i = 0; i != m; ++i)
struct edgearr[500]; //用於記載每一條邊
int head[500]; //用於追溯每個點最開始的邊,注意要看情況初始化,比如本體可全部賦值為-1
//對於有向邊的操作:
int u, v, w;
for(int i = 0; i != m; ++i);
head[u] = i;
}//對於無向邊的操作:
int u, v, w;
for(int i = 0, cur = 0; i != m; ++i); head[u] = cur++;
arr[cur] = (edge); head[v] = cur++; //充分利用所有的記憶體空間,但使用難度略高
}
在常用最短路演算法中,對於此類沒有負邊權的圖論
spfa和dijkstra都是不錯的選擇,為了確保不會被卡spfa,這裡採用了dijkstra
具體到演算法原理可以考慮檢視其它部落格演算法執行過程,不再贅述
priority_queue, greater> pq;
dist.fill(1e9); dist[s] = 0;
pq.push(make_pair(dist[s], s));
while(!pq.empty())
}}
我第一次使用遞迴版本的spfa的時候最後乙個點沒過去,這裡給出遞推的版本
稍後講解關於路徑列印的問題
int dist[maxn];
for(int i=1;i<=n;i++) dist[i]=inf;
q.push(s),vis[s]=true;dist[s]=0;
while(!q.empty())}}
}
一開始我是通過spfa與深搜聯合的方式做題,但發現過不去
因此這次將他們拆開
考慮到救援隊人數的問題
我們需要在一開始用乙個陣列記錄救援人數
arrayaid;
for (int i = 0; i != n; ++i) cin >> aid[i];
隨後開始使用剪枝深搜執行路徑
int cnt, max; //用於記錄最優解次數和最大值
string ans; //用於記錄路徑
void dfs(int pos, int dis, int val, string rode)
return;
}//其實這裡加乙個vis的判斷效率會更高,但為了**容易理解就捨棄了
vector&v = arr[pos].v, &w = arr[pos].w; //為了優化可讀性
for(int i = 0; i != v.size(); ++i)
}//開始時
dfs(s, 0, aid[s], to_string(s));
以上內容即為本題解析,後面有空把spfa的坑填上,畢竟**沒測試,萬一被用上了就不好了
這裡打出通過的**:
#include #include #include #include using namespace std;
typedef pairpii;
struct node arr[500];
arraydist;
arrayaid;
int n, m, s, d;
int cnt, max;
string ans;
void dfs(int pos, int dis, int val, string rode)
return;
}vector&v = arr[pos].v, &w = arr[pos].w;
for(int i = 0; i != v.size(); ++i)
}int main()
priority_queue, greater> pq;
dist.fill(1e9); dist[s] = 0;
pq.push(make_pair(dist[s], s));
while(!pq.empty())}}
// for(int i = 0; i != n; ++i) cout << dist[i] << ' '; cout << '\n';
dfs(s, 0, aid[s], to_string(s));
cout << cnt << ' ' << max << '\n' << ans;
}
天梯L2 001 緊急救援 25分)
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。...
天梯賽 L2 001 緊急救援
好氣,最後4分怎麼也得不上,還沒找出bug,此 還不完全正確,明天再找,好長時間不打感覺好生疏。思路關鍵在求最短路徑的條數,一般我是跑兩遍bfs來做。感覺通俗一些。越寫越醜 1 include 2 include 3 include 4 include 5 include 6 using names...
L2 001 緊急救援 (25 分)
作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助 給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。輸入第一行...