题目1:热浪
分析:
由题目可知,求的是两个点之间的最短距离,边权为正数且点数和边数属于同一量级,使用堆优化版的dijkstra进行求解即可。
这道题是无向图,我们建有向图能求解吗?
不能。 因为如果a 和 b有一条边, 我们只建一条有向边, 意味着 a能到b, b确不能到a, 如果输入时起点是b,终点是a,那么我们就到达不了a,答案出错。
关于能否只建有向图求解无向图的问题, 一定要证明,如果证明不出来,直接按题目要求建立无向图。
时间复杂度: O ( m ∗ l o g m ) O(m * log ^m) O(m∗logm)
代码区:
#include<iostream>
#include<cstring>
#include<queue>
#define x first
#define y second
using namespace std;
const int N = 2510, M = 6210 * 2;
typedef pair<int, int> PII;
int n, m, be, en;
int h[N], e[M], ne[M], w[M], idx;
bool st[N];
int dist[N];
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
int dijkstra()
{
memset(dist, 0x3f, sizeof dist);
dist[be] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, be});
while(heap.size())
{
auto t = heap.top();
heap.pop();
int ver = t.y, distance = t.x;
if(st[ver]) continue;
st[ver] = true;
for(int i = h[ver]; i != -1; i = ne[i])
{
int j = e[i];
if(dist[j] > distance + w[i])
{
dist[j] = distance + w[i];
heap.push({dist[j], j});
}
}
}
return dist[en];
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> be >> en;
while(m --)
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
cout << dijkstra();
return 0;
}
题目2:信使
分析:
题目中说明了起点为1, 求1号点到其它点最短距离的最大值。我们可以使用单源最短路, 由于这道题的数据范围比较小,所以我们使用5个最短路算法的任意一个都行,挑个简单的写就行了。