首页 > 其他分享 >最短路练习

最短路练习

时间:2023-08-26 12:13:23浏览次数:49  
标签:return int double sum 练习 mid times 短路

T1 Sightseeing Cows G

我们先考虑如何求平均乐趣值。

1.总乐趣为 \(\sum^n_{i = 1}f_i \times s_i\),其中 \(f_i\) 为第 \(i\) 个点的乐趣值,\(s_i\) 表示选不选。

2.路径是个环,总长度为 \(\sum^n_{i = 1}e_i \times s_i\) 其中 \(e_i\) 为从点 \(i\) 出发所走的边。

所以最大平均乐趣值就是 \(\max \dfrac{\sum^n_{i = 1}f_i \times s_i}{\sum^n_{i = 1}e_i \times s_i}\)。

于是就是 \(0/1\) 分数规划了。当然我们在处理时需要把整个式子 \(\times -1\),因为 SPFA 在处理负环时无法计算出一条大于 \(0\) 的路径。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10,maxm = 5e4 + 5;
struct edge
{
	int to,nxt;
	double w;
}e[maxm << 1];
int head[maxm],tot;
void add_edge(int u,int v,double w)
{
	e[++tot].nxt = head[u];
	head[u] = tot;
	e[tot].to = v;
	e[tot].w = w;
}
double dis[maxn];
int f[maxn],u[maxm],v[maxm],w[maxm];
int num[maxn];
int n,m;
void init()
{
	memset(head,0,sizeof(head));
	tot = 0;
}
bool vis[maxn];
bool spfa(int s)
{
	queue<int> q;
	for(int i = 1;i <= n;i++)
	{
		q.push(i);
		dis[i] = 0;
		vis[i] = num[i] = 1;
	}
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for(int i = head[u];i;i = e[i].nxt)
		{
			int v = e[i].to;
			if(dis[v] > dis[u] + e[i].w)
			{
				dis[v] = dis[u] + e[i].w;
				if(!vis[v])
				{
					q.push(v);
					vis[v] = 1;
					if(++num[v] >= n)
					{
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
bool check(double x)
{
	init();
	for(int i = 1;i <= m;i++)
	{
		add_edge(u[i],v[i],x * w[i] - f[u[i]]);
	}
	return spfa(1);
}
int main()
{
	cin >> n >> m;
	double l = 0,r = 0;
	for(int i = 1;i <= n;i++)
	{
		cin >> f[i];
		r += f[i];
	}
	for(int i = 1;i <= m;i++)
	{
		cin >> u[i] >> v[i] >> w[i];
	}
	while(r - l > 1e-5)
	{
		double mid = l + (r - l) / 2;
		if(check(mid))
		{
			l = mid;
		}
		else
		{
			r = mid;
		}
	}
	printf("%.2lf",l);
	return 0;
}

标签:return,int,double,sum,练习,mid,times,短路
From: https://www.cnblogs.com/Carousel/p/17658629.html

相关文章

  • 第二章总练习题
    重点习题:第3题及其应用(第4题).第5、6、7、8等题目都需要用到单调有界原理,重点把握这一重要的判断数列收敛的条件。  ......
  • java-文件复制练习
    packagecom.example.ss_0203_array.test.test_0826;importjava.io.*;publicclasstest2{publicstaticvoidmain(String[]args)throwsIOException{Filesrc=newFile("F:\\阿里云盘下载\\B站黑马java基础\\day10_字符串\\代码\\mystring");......
  • [校内] 计数练习
    0811T1计数练习题意作为一名普及组选手,小\(A\)喜欢数数。一天,小\(A\)学习了排列相关的知识。定义一个长度为\(n\)的序列\(p_{1...n}\)是一个\(n\)阶排列,当且仅当\(p_{1...n}\)都是\([1,n]\)中的正整数且它们两两不同。小\(A\)想数排列。为了让数排列更有趣,......
  • DQL-练习数据
    createtableemp(idintcomment'编号',worknovarchar(10)comment'工号',namevarchar(10)comment'姓名',gendercharcomment'性别',agetinyintunsignedcomment'年龄',idcardchar(18)......
  • 一维数组java练习
    1、打印下列图形*****************************************图形一:publicclassHomeWork8_24{publicstatic......
  • 变量和数据类型java练习
    1.①packagecom.company;publicclassHomeWork8_19{publicstaticvoidmain(String[]args){Stringname="小明";intage=25;intseniority=3;intage1=5;Stringsubject="java";......
  • 选择结构和循环结构java练习
    1、通过键盘输入学生分数并根据成绩定档:0-59分“不及格”,60-69分“及格”,70-79分“中等”,80-89分“良好”,90-100分“优秀”importjava.util.Scanner;publicclassHomeWork8_22{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System......
  • 牛客练习赛114 D题题解
    比赛编号太臭了题目链接对一第一组数据,我们形象化的得到下图:如何拆解使其变成一个“顺子”呢,我们像这样:贪心的从后往前取,对于取数列时的终点也就是枚举的起点如果不为0,就向前一直取,如果取到一个数\(x\)发现这个数的个数\(num_x\)是大于\(num_{x-1}\)的,就停止,最后看拆......
  • 《算法笔记》树与二叉树专题练习
    1、复原二叉树(由前序和中序求后序)题目描述小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。输入输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写......
  • python练习题01 碱基统计
     001、测试序列,碱基序列保存只a.fa文件中,统计下面这段序列中A、C、G、T碱基的个数[root@PC1test01]#lsa.fa[root@PC1test01]#cata.fa##测试fasta文件AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC 002、利用基本循环统计[ro......