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;
}