PAT 甲级 总结 —— 高级篇
一、最短路径
PAT中30分的常考题型,主要有Dijkstra算法、Floyd算法、Bellman-Ford算法(暂时未考)
dijkstra:无负边权单源最短路径问题万能通法,可以回溯路径,选取多条件最优路径
struct node {
int v, w;
};
int dis[maxn];
vector<int> pre[maxn];
vector<node> adj[maxn];
void Dijkstra(int s)
{
fill(dis, dis + maxn, INF);
dis[s] = 0;
for (int i = 0; i < n + 1; i++)
{
int min = INF, u = -1;
for (int j = 0; j < n + 1; j++)
{
if (!vis[j] && min > dis[j]) {
u = j;
min = dis[j];
}
}
if (u == -1)
{
return;
}
vis[u] = true;
for (int j = 0; j < adj[u].size(); j++)
{
int v = adj[u][j].v;
int w = adj[u][j].w;
if (!vis[v]) {
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
pre[v].clear();
pre[v].push_back(u); //记录前驱节点
}else if(dis[v] == dis[u] + w){
pre[v].push_back(u);
}
}
}
}
}
**Bellman-Ford算法:**如果有负边权的单源最短距离问题,dijkstra就不适用了
bool Bellman(int s,int n)
{
fill(d, d + maxn, INF);
dis[s] = 0;
for (int i = 0; i < n-1; i++)
{
for (int u = 0; u < n; u++)
{
for (int j = 0; j < adj[u].size(); j++)
{
int v = adj[u][j].v;
int w = adj[u][j].w;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
}
}
}<