1111 Online Map (30 points)

Title translation:

It is to find the shortest path from one point to another point.

However, due to many restrictions, it has to be calculated twice, so it is very complicated to write.

Question solution ideas:

You can use dijkstra or dfs. If you use the latter, the last test point may time out.

Code:

dfs (last test point timed out):

#include<bits/stdc + + .h>
using namespace std;
int N, M;//Number of nodes, number of edges
vector<int> v[501];
int dis[501][501];
int cost[501][501];
int mindis[501];
int min_len = INT_MAX, min_cost = INT_MAX;
vector<int> path1, path2, temp;
int so, des;
int temp_cost = INT_MAX;

void dfs(int curnode, int curlen, int curcost)
{
if (curlen > mindis[curnode]) return;
else
mindis[curnode] = curlen;
temp.push_back(curnode);
if (curnode == des)
{
if (curlen < min_len)
{
min_len = curlen;
path1 = temp;
temp_cost = curcost;
}
if (curlen == min_len & amp; & amp;curcost<temp_cost)
path1 = temp;
}
else {
for (auto i : v[curnode])
dfs(i, curlen + dis[curnode][i], curcost + cost[curnode][i]);
}
temp.pop_back();
}

void dfs2(int curnode, int curlen)
{
if (curlen > mindis[curnode]) return;
else
mindis[curnode] = curlen;
temp.push_back(curnode);
if (curnode == des)
{
if (curlen < min_cost)
{
min_cost = curlen;
path2 = temp;
}
if (curlen == min_cost & amp; & temp.size() < path2.size())
path2 = temp;
}
else {
for (auto i : v[curnode])
dfs2(i, curlen + cost[curnode][i]);
}
temp.pop_back();
}

int main()
{
cin >> N >> M;
int q, w, e, r, t;
for (int i = 0;i < M;i + + )
{
cin >> q >> w >> e >> r >> t;
if (e)//One-way
{
v[q].push_back(w);
dis[q][w] = r;
cost[q][w] = t;
}
else//bidirectional
{
v[q].push_back(w);
v[w].push_back(q);
dis[q][w] = dis[w][q] = r;
cost[q][w] = cost[w][q] = t;
}
}
for (int i = 0;i < 501;i + + )
mindis[i] = INT_MAX;
cin >> so >> des;
dfs(so, 0, 0);
for (int i = 0;i < 501;i + + )
mindis[i] = INT_MAX;
temp.clear();
dfs2(so, 0);
if (path1 != path2)
{
cout << "Distance = " << min_len << ":";
for (int i = 0;i < path1.size();i + + )
{
if(i)
cout << " ->";
cout << " " << path1[i];
}
cout << endl;
}
else
cout << "Distance = " << min_len << "; ";
cout << "Time = " << min_cost << ":";
for (int i = 0;i < path2.size();i + + )
{
if(i)
cout << " ->";
cout << " " << path2[i];
}
}

dijkstra (AC, reprinted in AC code)

#include<bits/stdc + + .h>
using namespace std;

int n, m, source, dest, min_distance, min_time;
vector<int> ans_t, ans_d, dpre(500, -1), tpre(500, -1);
vector<vector<int>> times(500, vector<int>(500, -1)), distances(500, vector<int>(500, -1)), graph(500,vector<int>(500, 0));
void dfs1(int x){
    if(x == -1) return;
    dfs1(dpre[x]);
    ans_d.push_back(x);
}
void dfs2(int x){
    if(x == -1) return;
    dfs2(tpre[x]);
    ans_t.push_back(x);
}
void dijkstra1(int beg){
    vector<int> lowcost(500, 0x3f3f3f3f), vis(500, 0), dtime(500, 0x3f3f3f3f);
    lowcost[beg] = 0;
    dpre[beg] = -1;
    for (int i = 0; i < n;i + + ){
        int Min = 0x3f3f3f3f, k = -1;
        for (int j = 0; j < n; j + + ){
            if(vis[j] == 0 & amp; & amp; lowcost[j] < Min){
                Min = lowcost[j];
                k = j;
            }
        }
        if(k == -1) break;
        vis[k] = 1;
        for (int j = 0; j < n; j + + ){
            if(vis[j] == 0 & amp; & amp; graph[j][k] == 1){
                //If the conditions are met, update the information. Pay attention to the logic short circuit phenomenon here.
                if(lowcost[j] > lowcost[k] + distances[j][k] || (lowcost[j] == lowcost[k] + distances[j][k] & amp; & amp; dtime[k] + times[k][j] < dtime[j])){
                    dpre[j] = k;
                    dtime[j] = dtime[k] + times[k][j];
                    lowcost[j] = lowcost[k] + distances[j][k];
                }
            }
        }
    }
    min_distance = lowcost[dest];
    dfs1(dest);
}

void dijkstra2(int beg){
    vector<int> lowcost(500, 0x3f3f3f3f), vis(500, 0), intersections(500, 0x3f3f3f3f);
    lowcost[beg] = 0;
    tpre[beg] = -1;
    for (int i = 0; i < n;i + + ){
        int Min = 0x3f3f3f3f, k = -1;
        for (int j = 0; j < n; j + + ){
            if(vis[j] == 0 & amp; & amp; lowcost[j] < Min){
                Min = lowcost[j];
                k = j;
            }
        }
        if(k == -1) break;
        vis[k] = 1;
        for (int j = 0; j < n; j + + ){
            if(vis[j] == 0 & amp; & amp; graph[j][k] == 1){
                if(lowcost[j] > lowcost[k] + times[j][k] || (lowcost[j] == lowcost[k] + times[j][k] & amp; & amp; intersections[k] + 1 < intersections[j])){
                    tpre[j] = k;
                    intersections[j] = intersections[k] + 1;
                    lowcost[j] = lowcost[k] + times[j][k];
                }
            }
        }
    }
    min_time = lowcost[dest];
    dfs2(dest);
}

int main(){
    int s, e, a, l, t, isSame = 1;
    cin >> n >> m;
    for (int i = 0; i < m;i + + ){
        cin >> s >> e >> a >> l >> t;
        graph[s][e] = graph[e][s] = 1;
        times[s][e] = times[e][s] = t;
        distances[s][e] = distances[e][s] = l;
    }
    cin >> source >> dest;
    dijkstra1(source);
    dijkstra2(source);
    if(ans_d.size() == ans_t.size()){
        for (int i = 0; i < ans_t.size();i + + ){
            if(ans_t[i] != ans_d[i]){
                isSame = 0;
                break;//Save some time if you can
            }
        }
    }else
        isSame = 0;
    if(isSame == 0){
        printf("Distance = %d: %d", min_distance, ans_d[0]);
        for (int i = 1; i < ans_d.size();i + + )
            printf(" -> %d", ans_d[i]);
        printf("\
Time = %d: %d", min_time, ans_t[0]);
        for (int i = 1; i < ans_t.size();i + + )
            printf(" -> %d", ans_t[i]);
    }else{
        printf("Distance = %d; Time = %d: %d", min_distance, min_time, ans_t[0]);
        for (int i = 1; i < ans_t.size();i + + )
            printf(" -> %d", ans_t[i]);
    }
    cout << endl;
    return 0;
}

Pitfalls:

Test point 4 may time out when using dfs