UVA 11090 – Going in Cycle!!(Bellman-Ford)[通俗易懂]

UVA 11090 – Going in Cycle!!(Bellman-Ford)

大家好,又见面了,我是全栈君。

UVA 11090 – Going in Cycle!!

题意:给定一个有向图,球平均权值最小的回路

思路:二分+判负环。每次二分一个值mid。推断是否存在小于mid的环,那么就是(w1 + w2 + w3…) / n < mid == w1 – mid + w2 – mid + w3 – mid …. < 0,所以每次二分的时候。把边权值减掉mid。之后bellmanford判负环就可以

代码:

#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <queue>using namespace std;typedef double Type;const int MAXNODE = 55;struct Edge {	int u, v;	Type dist;	Edge() {}	Edge(int u, int v, Type dist) {		this->u = u;		this->v = v;		this->dist = dist;	}};struct BellmanFrod {	int n, m;	vector<Edge> edges;	vector<int> g[MAXNODE];	bool inq[MAXNODE];	Type d[MAXNODE];	int p[MAXNODE];	int cnt[MAXNODE];	void init(int n) {		this->n = n;		for (int i = 0; i < n; i++) g[i].clear();		edges.clear();	}	void add_Edge(int u, int v, Type dist) {		edges.push_back(Edge(u, v, dist));		m = edges.size();		g[u].push_back(m - 1);	}	bool negativeCycle() {		queue<int> Q;		memset(inq, 0, sizeof(inq));		memset(cnt, 0, sizeof(cnt));		for (int i = 0; i < n; i++) {			d[i] = 0; inq[i] = true; Q.push(i);		}		while (!Q.empty()) {			int u = Q.front();			Q.pop();			inq[u] = false;			for (int i = 0; i < g[u].size(); i++) {				Edge& e = edges[g[u][i]];				if (d[e.v] > d[u] + e.dist) {					d[e.v] = d[u] + e.dist;					p[e.v] = g[u][i];					if (!inq[e.v]) {						Q.push(e.v);						inq[e.v] = true;						if (++cnt[e.v] > n) return true;					}				}			}		}		return false;	}} gao;int T, n, m;bool judge(double mid) {	for (int i = 0; i < gao.m; i++)		gao.edges[i].dist -= mid;	bool tmp = gao.negativeCycle();	for (int i = 0; i < gao.m; i++)		gao.edges[i].dist += mid;	return tmp;}int main() {	scanf("%d", &T);	int cas = 0;	while (T--) {		scanf("%d%d", &n, &m);		gao.init(n);		int u, v;		double dist;		double Max = 0;		while (m--) {			scanf("%d%d%lf", &u, &v, &dist);			u--; v--;			Max = max(Max, dist);			gao.add_Edge(u, v, dist);		}		printf("Case #%d: ", ++cas);		if (!judge(Max + 1)) printf("No cycle found.\n");		else {			double l = 0, r = Max;			for (int i = 0; i < 100; i++) {				double mid = (l + r) / 2;				if (!judge(mid)) l = mid;				else r = mid;			}			printf("%.2lf\n", l);		}	}	return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116495.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • socat介绍「建议收藏」

    socat是一個netcat(nc)的替代產品,可以稱得上nc++。socat的特點就是在兩個流之間建立一個雙向的通道。socat的地址類型很多,有ip,tcp,udp,ipv6,pipe,exec,system,open,proxy,openssl,等等。看一個例子:c:\>socat-tcp:192.168.1.18:80這個命令等同於nc192.168.1

    2022年4月7日
  • 页式虚拟存储管理_页式虚拟存储管理的主要特点

    页式虚拟存储管理_页式虚拟存储管理的主要特点页式存储的基本原理    将程序的逻辑地址空间划分为固定大小的页(page),而物理内存划分为同样大小的页框(pageframe)。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。也就是把内存等分成N份,存放运行的程序时,按分成的快放置即可。但放置时要考虑主存里哪些块已经被占用,这个用主存分配表(位示图)来表示。     分页式存储器的逻辑

    2022年9月26日
  • 构建算法模型_模型与算法有什么不同

    构建算法模型_模型与算法有什么不同文章目录1.情感词典内容2.情感倾向点互信息算法(SO-PMI)算法点互信息算法PMI情感倾向点互信息算法SO-PMI3.构建情感词典1.导入项目2.构建情感种子词3.使用TF-IDF方便构建情感种子词4.构建专业词典的效果与使用方法5.其他说明1.情感词典内容情感词典构建方法归为三类,分别是:词关系扩展法、迭代路径法和释义扩展法情感极性:正向、负向;表示正面情感(开心愉快)或负面情感(伤心愤怒)情感极值:情感倾向(微笑、开怀大笑、手舞足蹈虽然都可以表示开心,但有不一样的

    2022年8月23日
  • 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解[通俗易懂]

    详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解[通俗易懂]声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。本文作者:nebulaf91本文原始地址:最大似然估计(Maximumlikelihoodestimation,简称MLE)和最大后验概率估计(Maximumaposterioriestimation,简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很

    2022年9月18日
  • 请介绍你在互联网上搜索工具软件的方法或经验_大型互联网公司有哪些

    请介绍你在互联网上搜索工具软件的方法或经验_大型互联网公司有哪些播妞的一位朋友,用了将近10年电脑。但他的信息检索能力令人诧异。每次需要找点图片、网站甚至小电影,都需要用很久时间,在各大网站论坛里里疲于奔波。因为他只会用百度和360啊!然而,百度或者google虽然可以提供海量信息,但甄选信息可是一件非常麻烦的事情。如果你想用更垂直更方便的搜索工具,请看下面6个。在一定程度上,它们能帮你摆脱仗势欺人的百度,还能比别人搜到更多资源。基于大家日常上

    2022年9月10日
  • requestparam注解接的收的是什么格式(玄机赋注解)

    1、作用:@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)2、语法:语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)value:参数名required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含…

    2022年4月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号