Dijkstra 40pts 求助
查看原帖
Dijkstra 40pts 求助
682394
Moon_Traveller楼主2023/5/15 23:04

记录

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define int long long

struct Edge
{
    int next;
    int to;
    int dis;
};

struct node
{
    int num;
    int val;
    bool operator < (const node &a) const
    {
        return a.val < val;
    }
};

int n, m;
Edge e1[2003], e2[2003];
int head1[1003], head2[1003];
int num_edge1, num_edge2;
int dis1[1003], dis2[1003];
int vis1[1003], vis2[1003];

priority_queue<node> q;

void add_edge(int u, int v, int w, int p)
{
    if(p == 1) // 建正边
    {
        num_edge1++;
        e1[num_edge1].to = v;
        e1[num_edge1].dis = w;
        e1[num_edge1].next = head1[u];
        head1[u] = num_edge1;
    }
    else // 建反边
    {
        num_edge2++;
        e2[num_edge2].to = v;
        e2[num_edge2].dis = w;
        e2[num_edge2].next = head2[u];
        head2[u] = num_edge2;
    }
    return;
}

void dijkstra1() // 遍历正边
{
    dis1[1] = 0;
    q.push((node){1, 0});
    while(q.size())
    {
        node tmp = q.top();
        q.pop();
        if(vis1[tmp.num])
        {
            continue;
        }
        vis1[tmp.num] = 1;
        for(int i = head1[tmp.num]; i; i = e1[i].next)
        {
            int to = e1[i].to;
            int diss = e1[i].dis;
            if(dis1[to] > diss + dis1[tmp.num])
            {
                dis1[to] = diss + dis1[tmp.num];
                if(!vis1[to])
                {
                    q.push((node){to, dis1[to]});
                }
            }
        }
    }
}

void dijkstra2() // 遍历反边
{
    dis2[1] = 0;
    q.push((node){1, 0});
    while(q.size())
    {
        node tmp = q.top();
        q.pop();
        if(vis2[tmp.num])
        {
            continue;
        }
        vis2[tmp.num] = 1;
        for(int i = head2[tmp.num]; i; i = e2[i].next)
        {
            int to = e2[i].to;
            int diss = e2[i].dis;
            if(dis2[to] > diss + dis2[tmp.num])
            {
                dis2[to] = diss + dis2[tmp.num];
                if(!vis2[to])
                {
                    q.push((node){to, dis2[to]});
                }
            }
        }
    }
}

signed main()
{
    memset(dis1, 0x3f, sizeof(dis1));
    memset(dis2, 0x3f, sizeof(dis2));
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        add_edge(u, v, w, 1);
        add_edge(v, u, w, 2);
    }
    dijkstra1();
    dijkstra2();
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        ans += dis1[i] + dis2[i];
    }
    cout << ans << endl;
    return 0;
}

4RE+2TLE,没调出来。麻烦大佬看一下哪里错了,感谢!

2023/5/15 23:04
加载中...