kuangbin最短路专题Wormholes POJ - 3259

kuangbin最短路专题

传送门

题面

题面

思路

显而易见,单向通道是负边权,用bellmanford或者spfa模板就可以过了

代码

bellman_ford

#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include<iomanip>
#include<sstream>
#pragma pack(1)
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#pragma comment(linker, "/STACK:102400000,102400000")
#define ll long long
#define pb push_back
#define mP make_pair
#define debugs(x) cout << "Line" << __LINE__ << "	" << #x << "=" << x << endl
#define break break
#define itn int
#define Endl endl
#define vint vector<int>
#define pii pair<int, int> 
using namespace std;

int n, m, k, tot, s;
struct lxm
{
	int u, v, cost;
}ed[5505];
int cnt = 0;
int ans[505];
void addedge(int u, int v, int c)
{
	ed[++cnt].u = u;
	ed[cnt].v = v;
	ed[cnt].cost = c;
}
string bellman_ford()
{
	memset(ans, 0x3f3f3f3f, sizeof(ans));
	ans[1] = 0;
	bool f = 0;
	for (int i = 1; i < n; i++)
	{
		f = 0;
		for (int j = 1; j <= cnt; j++)
		{
			if (ans[ed[j].v] > ans[ed[j].u] + ed[j].cost)
			{
				ans[ed[j].v] = ans[ed[j].u] + ed[j].cost;
				f = 1;
			}
		}
		if (!f)break;
	}
	for (int i = 1; i <= cnt; i++)
		if (ans[ed[i].v] > ans[ed[i].u] + ed[i].cost)
			return "YES\n";
	return "NO\n";
}
void solve()
{
	cnt = 0;
	cin >> n >> m >> k;
	int u, v, c;
	for (int i = 1; i <= m + k; i++)
	{
		cin >> u >> v >> c;
		if (i <= m)
		{
			addedge(u, v, c);
			addedge(v, u, c);
		}
		else addedge(u, v, -c);
	}
	cout << bellman_ford();
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int numoftest; cin >> numoftest;
	for (register int siven = 1; siven <= numoftest; ++siven)

		solve();
	return 0;
}

spfa

#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include<iomanip>
#include<sstream>
#pragma pack(1)
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#pragma comment(linker, "/STACK:102400000,102400000")
#define ll long long
#define pb push_back
#define mP make_pair
#define debugs(x) cout << "Line" << __LINE__ << "	" << #x << "=" << x << endl
#define break break
#define itn int
#define Endl endl
#define vint vector<int>
#define pii pair<int, int> 
using namespace std;

int n, m, k, tot, s;
struct lxm
{
	int to, cost, nxt;
}ed[5505];
int head[505];
int cnt = 0;
int ans[505];
void addedge(int u, int v, int c)
{
	ed[++cnt].to = v;
	ed[cnt].cost = c;
	ed[cnt].nxt = head[u];
	head[u] = cnt;
}
bool vis[505];
int num[505];
string spfa()
{
	memset(ans, 0x3f3f3f3f, sizeof(ans));
	memset(num, 0, sizeof(num));
	memset(vis, 0, sizeof(vis));
	vis[1] = 1;
	ans[1] = 0;
	num[1]++;
	queue<int>Q;
	Q.push(1);
	while (Q.size())
	{
		int tmp = Q.front();
		Q.pop();
		vis[tmp] = 0;
		for (int i = head[tmp]; i; i = ed[i].nxt)
		{
			int v = ed[i].to;
			if (ans[v] > ans[tmp] + ed[i].cost)
			{
				ans[v] = ans[tmp] + ed[i].cost;
				if (!vis[v])
				{
					vis[v] = 1;
					Q.push(v);
					num[v]++;
					if (num[v] > n)return "YES\n";
				}
			}
		}
	}
	return "NO\n";
}
void solve()
{
	cnt = 0;
	cin >> n >> m >> k;
	int u, v, c;
	memset(head, 0, sizeof(head));
	for (int i = 1; i <= m + k; i++)
	{
		cin >> u >> v >> c;
		if (i <= m)
		{
			addedge(u, v, c);
			addedge(v, u, c);
		}
		else addedge(u, v, -c);
	}
	cout << spfa();
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int numoftest; cin >> numoftest;
	for (register int siven = 1; siven <= numoftest; ++siven)

		solve();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值