救助,Dijkstrea,样例过了,提交全WA
查看原帖
救助,Dijkstrea,样例过了,提交全WA
462003
tommyfj楼主2022/10/2 20:42
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#define int long long
using namespace std;
int n,m,ans,cnt;
int u, v, w;
int dis[2010], head[2010];
bool vis[2010];
struct edge
{
    int to, next, dis;
}a[200010];
struct node
{
    int dis, pos;
    friend bool operator < (node a, node b) {
        return a.dis < b.dis;
    }
};
void add(int u, int v, int w)
{
    a[++ cnt].dis = w;
    a[cnt].to = v;
    a[cnt].next = head[u];
    head[u] = cnt;
}
priority_queue<node> q;
void dijkstra(int s)
{
    memset(vis, 0, sizeof(vis));
    for (int i = 1;i <= 2 * n;i ++) dis[i] = 0x7ffffffff;
    dis[s] = 0;
    q.push({0, s});
    while (!q.empty())
    {
        node temp = q.top();
        q.pop();
        int x = temp.pos;
        if (vis[x]) continue;
        vis[x] = 1;
        for (int i = head[x];i;i = a[i].next)
        {   
            int y = a[i].to;
            if (dis[y] > dis[x] + a[i].dis)
            {
                dis[y] = dis[x] + a[i].dis;
                if (!vis[y]) q.push({dis[y], y});
            }
        }
    }
}
signed main()
{
    scanf("%lld %lld", &n, &m);
    for (int i = 1;i <= m;i ++)
    {
        scanf("%lld %lld %lld", &u, &v, &w);
        add(u, v, w);
        add(v + n, u + n, w);
    }
    dijkstra(1);
    for (int i = 1;i <= n;i ++) ans += dis[i];
    dijkstra(1 + n);
    for (int i = 1 + n;i <= 2 * n;i ++) ans += dis[i];
    printf("%lld\n", ans);
    return 0;
}
2022/10/2 20:42
加载中...