概述
题意
给定六条边,让你设定他们的权值,加进去后,图不要产生负环。
输出六条边的边权。
思路
对于第一条边,u v,我求v到u的最短路dis,那么u v的边权即为dis。
将u v这条边加入图中。
对于第二条边,重复上述操作即可。
这样就能保证图中不会产生负环。
不能用 Dijkstra 算法,虽然没有负环,但是有负边就不能用 Dijkstra
用 SPFA 或者 Bellman - Ford 才能处理负边。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e2 + 10;
const int INF = 0x3f3f3f3f;
struct Edge{
int v, cost;
Edge(int _v = 0, int _cost = 0) : v(_v), cost(_cost){}
};
vector<Edge>E[maxn];
bool vis[maxn];
int dist[maxn];
int cnt[maxn];
bool SPFA(int n, int start)
{
memset(vis, false, sizeof(vis));
for(int i = 0; i < n; i++)
dist[i] = INF;
vis[start] = true;
dist[start] = 0;
queue<int>que;
que.push(start);
memset(cnt, 0, sizeof(cnt));
cnt[start] = 1;
while(!que.empty())
{
int u = que.front();
que.pop();
vis[u] = false;
for(int i = 0; i < E[u].size(); i++)
{
int v = E[u][i].v;
if(dist[v] > dist[u] + E[u][i].cost)
{
dist[v] = dist[u] + E[u][i].cost;
if(!vis[v])
{
vis[v] = true;
que.push(v);
if(++cnt[v] > n)
return false;
}
}
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
E[i].clear();
int u, v, w;
for(int i = 1; i <= m; i++){
scanf("%d %d %d", &u, &v, &w);
E[u].push_back(Edge(v, w));
}
for(int i = 1; i <= 6; i++)
{
scanf("%d %d", &u, &v);
SPFA(n, v);
printf("%dn", -dist[u]);
E[u].push_back(Edge(v, -dist[u]));
}
}
return 0;
}
最后
以上就是靓丽滑板为你收集整理的2019 ICPC南京网络赛 H题(SPFA/Bellman-Ford)的全部内容,希望文章能够帮你解决2019 ICPC南京网络赛 H题(SPFA/Bellman-Ford)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复