4236899_tle.cpp

来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 90 行

CPP
90
字号
#include <queue>
#include <vector>
#include <stdio.h>
#include <algorithm>

#define MAXN 1000000

using namespace std;

int n, e;
struct Node
{
	int tar;
	__int64 cost;

	Node(int _tar, __int64 _cost) : tar (_tar), cost (_cost) {};
};

vector <Node> map[MAXN], _map[MAXN];
int inqueue[MAXN];
__int64 dis[MAXN];
int que[MAXN];

__int64 SPFA(vector <Node> g[])
{
	int i, u, v;
	__int64 tmp;
	int f, r;

	for (i = 0; i < n; i++)
	{
		inqueue[i] = 0;
		dis[i] = -1;
	}
	dis[0] = 0;
	f = r = 0;
	que[r++] = 0;
	inqueue[0] = 1;
	while (f != r)
	{
		u = que[f++];
		inqueue[u] = 0;
		for (i = 0; i < g[u].size(); i++)
		{
			v = g[u][i].tar;
			tmp = dis[u] + g[u][i].cost;
			if (dis[v] == -1 || tmp < dis[v])
			{
				dis[v] = tmp;
				if (!inqueue[v])
				{
					inqueue[v] = 1;
					que[r++] = v;
				}
			}
		}
	}
	__int64 ret = 0;
	for (i = 0; i < n; i++)
	{
		ret += dis[i];
	}
	return ret;
}

int main()
{
	int cas, i;
	int a, b;
	__int64 c;

	scanf("%d", &cas);
	while (cas--)
	{
		scanf("%d%d", &n, &e);
		for (i = 0; i < n; i++)
		{
			map[i].clear();
			_map[i].clear();
		}
		for (i = 0; i < e; i++)
		{
			scanf("%d%d%I64d", &a, &b, &c);
			map[a - 1].push_back(Node(b - 1, c));
			_map[b - 1].push_back(Node(a - 1, c));
		}
		printf("%I64d\n", SPFA(_map) + SPFA(map));
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?