首页 > 编程语言 >图论算法学习笔记

图论算法学习笔记

时间:2024-02-04 09:55:38浏览次数:31  
标签:std 图论 dist int 笔记 far 算法 push include

ybt 1376

floyd

#include<iostream>
#include<climits>
#include<cstring>
#include<queue>
#include<vector>
#define infinity 0x3f3f3f3f
#define N 105
int n,m,G[N][N],dist[N][N];
int main(){
	memset(dist,infinity,sizeof(dist));
	std::cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b,c;
		std::cin>>a>>b>>c;
		G[a][b]=G[b][a]=c;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j){
				G[i][j]=0;
			}else if(G[i][j]){
				dist[i][j]=G[i][j];
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				if(dist[j][k]>dist[j][i]+dist[i][k]){
					dist[j][k]=dist[j][i]+dist[i][k];
				}
			}
		}
	}
	int res=INT_MIN;
	for(int i=1;i<=n;i++){
		if(dist[1][i]==infinity){
			std::cout<<-1;
			return 0;
		}else{
			res=std::max(res,dist[1][i]);
		}
	}
	std::cout<<res;
}

dijk

#include<iostream>
#include<climits>
#include<cmath>
#include<queue>
#include<vector>
#define ll long long
struct Node{
	int to,far;
};
std::vector<ll>dijk(std::vector<std::vector<Node>>G,int n,int start){
	std::vector<ll>dist(n+1,INT_MAX);
	std::vector<bool>vis(n+1,0);
	std::priority_queue<std::pair<ll,ll>,std::vector<std::pair<ll,ll>>,std::greater<std::pair<ll,ll>>>q;
	q.push(std::make_pair(0,start));
	dist[start]=0;
	while(q.size()){
		ll from=q.top().second;
		q.pop();
		if(vis[from]){
			continue;
		}
		vis[from]=1;
		for(auto i:G[from]){
			if(dist[i.to]>dist[from]+i.far){
				dist[i.to]=dist[from]+i.far;
				q.push(std::make_pair(dist[i.to],i.to));
			}
		}
	}
	return dist;
}
int main(){
	int n,m;
	std::cin>>n>>m;
	std::vector<std::vector<Node>>G(n+1);
	for(int i=0;i<m;i++){
		int from,to,far;
		std::cin>>from>>to>>far;
		G[from].push_back(Node{to,far});
		G[to].push_back(Node{from, far});
	}
	std::vector<ll>f=dijk(G,n,1);
	ll res=INT_MIN;
	for(int i=1;i<=n;i++){
		res=std::max(res,f[i]);
	}
	if(res==INT_MIN)std::cout<<-1;
	else std::cout<<res;
}

标签:std,图论,dist,int,笔记,far,算法,push,include
From: https://www.cnblogs.com/LightDirection/p/18005627

相关文章

  • Docker笔记(一)docker 在linux里面的安装
    Docker笔记(一)docker在linux里面的安装为什么使用docker(docker理念)在开发环境,将源码+配置+软件等其他项目运行的所有的东西,都打包,直接都给运维,这样运维就不需要自己搭建项目运行的环境了,因为你已经拿到了开发人员本地的全部的东西,相当于拿到开发人员全部的东西,直接在运维那里就......
  • 【学习笔记】字符串
    1.KMP【模板】KMP朴素的比对是如下的:for(inti=0;i<a.size()-b.size();i++){ for(intj=0;j<b.size();j++){ if(a[i+j]!=b[j])break; if(j==b.size()-1)cout<<i<<''; }}设A串长度\(n\),B串长度\(m\),显然这么做是\(O(nm)\)的。很容易想到一个错误优化:如果失......
  • Problem P06. [算法课分治] 找到 k 个最长重复字符串
    注意是在该子字符串内每个字符的出现次数都不少于k。可以采用分治的方法,函数找一个不符合条件的字符,然后将字符串分成两个子字符串,就这样进行递归运算,每次找到符合条件的子字符串就判断一波长度,然后将最长的长度值存下来。#include<iostream>#include<bits/stdc++.h>#includ......
  • 贪心算法
    贪心算法(就是猜测再试试证明)905.区间选点905.区间选点-AcWing题库 给定 N个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数 N,表示区间数。接下......
  • 快速排序算法
    快速排序算法的核心思想是分治法(DivideandConquer)。快速排序算法通过以下步骤实现排序:1.选择基准值 :从数列中选择一个元素作为基准值(pivot),通常选择第一个元素。2.分区操作 :重新排列数列,使得所有小于基准值的元素都移到基准的前面,而所有大于基准值的元素都移到基准的后......
  • 【笔记】快速傅里叶变换
    快速傅里叶变换0记号\(\exp(x)=e^x\)。1复数(Complex)1.1三种形式代数形式:\(z=a+bi\),其中\(a,b\in\mathbbR\)。三角形式:\(z=r(\cos\theta+i\sin\theta)\),其中\(r=\sqrt{a^2+b^2}\)(\(a,b\)是在代数形式中定义的)。指数形式:\(z=r\cdote^{i\theta}\)。根据......
  • Python 机器学习 K-近邻算法 鸢尾花种类预测
    ​ K-近邻算法(K-NearestNeighbors,KNN)是一种简单而强大的机器学习算法,适用于分类和回归任务。可以使用scikit-learn库的KNN算法来预测鸢尾花(Iris)的种类。鸢尾花数据集是机器学习领域中常用的一个数据集,包含了150个鸢尾花样本,每个样本有四个特征:萼片长度、萼片宽度、花瓣长度......
  • 每天1plus道算法题【学习->理解->创新】
    原则和步骤 2024/2/3原则动脑子,具体说就是揣摩背后的思路,思考并查询其在哪种场景下产生的,为了解决什么问题其实这个算是智力题游戏,既然是游戏就可以打怪升级越变越强的步骤step1读题+思考得出解法10min(一遍都是暴力解法)step2尝试写程序实现,可以先提交初版(在vscode里写或......
  • 数学の总结(笔记 + 自学)
    写在「开始」之前:由于笔者从初中二年级就踏上了数学的学习路程,再加上笔者理解力比较强,若有说的不明白的地方,还望指正,thx1.集合我们知道,一个字母可以表示一个数,比如说\(a=0\)。那么,有没有一种东西,可以容纳很多个字母呢?答案是肯定的,数学家们提出了一种叫做集合的一种容器,其中......
  • einops 学习笔记:基础篇
    参考:https://einops.rocks/1-einops-basics/einops(EinsteinOperations)提供了一种语法来便捷地操纵张量。einops支持大多数张量库(当然包括numpy和pytorch)。einops针对所有张量库的语法都完全一致。einops不会影响反向传播的正常进行。这些特性意味着einops可以和现有......