首页 > 其他分享 >图论学习笔记

图论学习笔记

时间:2024-04-09 15:03:47浏览次数:14  
标签:图论 val int nd cnt 笔记 学习 vis len

Dijkstra单源最短路径

堆优化。注意要定义成小根堆,而priority_queue默认大根堆

再就是每个点最多入队一次,可以用vis数组记录

证明:如果已经出队,说明队列中全都是val值比他大的(负权边?),这样他的val值一定已经是最终值了;

如果没有入队,进行更改之后会在堆中体现,不需要担心之后还会更新他的val值

#include<bits/stdc++.h>
using namespace std;

const int N=200000,M=1000000,inf=(1<<30)-1+(1<<30);
int n,m,s,cnt;
struct node{
    int num,head,val=inf,vis=0;
    bool operator <(const node &tmp)const{
        return val>tmp.val;//change it into a small root heap
    }
}a[N];
struct edge{
    int nxt,to,len;
}e[M];
priority_queue<node>q;

void add(int u,int v,int w){
    e[++cnt].nxt=a[u].head;
    e[cnt].to=v;
    e[cnt].len=w;
    a[u].head=cnt;
}

void Dij(){
    a[s].val=0;q.push(a[s]);
    while(!q.empty()){
        node x=q.top();q.pop();
        if(a[x.num].vis) continue; a[x.num].vis=1;
        //When it comes to here,x.val is the newest value.It's useless to update once again.
        for(int i=x.head;i;i=e[i].nxt){
            if(e[i].len+x.val<a[e[i].to].val){
                a[e[i].to].val=e[i].len+x.val;
                q.push(a[e[i].to]);
            }
        }
    }
}

int main(){
    cin>>n>>m>>s;
    for(int i=1;i<=n;++i) a[i].num=i;
    for(int i=1;i<=m;++i){int u,v,w;cin>>u>>v>>w;add(u,v,w);}
    Dij();
    for(int i=1;i<=n;++i) cout<<a[i].val<<' '; cout<<endl;
    return 0;
}

SPFA找负环

vis记录目前已经在队列中的不再次入队,稠密图中效率不如floyd

多测清空![怒]

#include<bits/stdc++.h>
using namespace std;

const int N=10000,inf=1000000000;
int n,m;
struct node{
	int val,cnt,head,vis;
}nd[N];
queue<int> q;
struct edge{
	int nxt,len,to;
}e[N];int cnt;

void memst(){
	cnt=0;nd[0].val=inf;
	while(!q.empty()) q.pop();
	for(int i=1;i<=n;++i) nd[i]=nd[0];
	for(int j=1;j<=m;++j) e[j]=e[0];
}

void add(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].len=w;
	e[cnt].nxt=nd[u].head;
	nd[u].head=cnt;
}

int spfa(){
 	++nd[1].cnt;nd[1].val=0; q.push(1);
	while(!q.empty()){
		int x=q.front();q.pop();nd[x].vis=0;
		for(int i=nd[x].head;i;i=e[i].nxt){
			int v=e[i].to;
			if(nd[v].val>nd[x].val+e[i].len){
				nd[v].val=nd[x].val+e[i].len;
				if(nd[v].vis) continue;
				++nd[v].cnt;nd[v].vis=1;
				if(nd[v].cnt>=n) return 1;
				q.push(v);
			}
		}
	}
	return 0;
}

int main(){
	int T;cin>>T;while(T--){
		cin>>n>>m;memst();
		for(int i=1;i<=m;++i){
			int u,v,w;cin>>u>>v>>w;add(u,v,w);
			if(w>=0) add(v,u,w);
		}
		if(spfa()) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

标签:图论,val,int,nd,cnt,笔记,学习,vis,len
From: https://www.cnblogs.com/w-official/p/18123969

相关文章

  • 机器学习 —— MNIST手写体识别
    本文使用工具    Anaconda下载安装与使用    JupyterNotebook的使用    pytorch配置        Jupyternotebook        Pycharm本文使用数据集    机器学习实验所需内容.zip        点击跳转至正文......
  • GUI development with Rust and GTK4 阅读笔记
    简记这是我第二次从头开始阅读,有第一次的印象要容易不少。如果只关心具体的做法,而不思考为什么这样做,以及整体的框架,阅读的过程将会举步维艰。简略记录gtk-rs的书中提到的点。对同一个问题书中所演示了多种处理方法,而且跨度比较大,第一次阅读的时候经常出现忘记之前的内容。f......
  • 【机器学习】2. 支持向量机
    2.支持向量机对偶优化拉格朗日乘数法可用于解决带条件优化问题,其基本形式为:\[\begin{gather}\min_wf(w),\\\mathrm{s.t.}\quad\cases{g_i(w)\le0,\\h_i(w)=0.}\end{gather}\]该问题的拉格朗日函数为\[L(w,\alpha,\beta)=f(w)+\sum_{i}\alpha_ig_i(w)+\sum_j\beta_j......
  • .net core的依赖注入学习
    依赖注入(DependencyInjection,DI),简称DI,它可以降低各模块之间的耦合首先需要安装两个Nuget包:Microsoft.Extensions.DependencyInjectionMicrosoft.Extensions.DependencyInjection.Abstractions安装完之后要在主程序里面引用第一个包usingMicrosoft.Extensions.DependencyIn......
  • 大菜菜学习RabbitMQ——第七篇
    这一篇文章我们讲的是另一个转换机topic转换机topic:话题相对于其他交换机来说这个交换机有很强的灵活性首先我们需要创建两个queue,名字的话这样就可以 然后创建对应的交换机在这里交换机的类型应该要选择为topic然后我们就可以开始binding了 这里我们看到有个符号我们......
  • SIT327网络取证学习 - 1
    WiFi取证分析背景学习:对于大型数据包捕获,tcpdump和tshark相比较于Wireshark来说更加有效与更具有可扩展性。802.11是一组不断发展的无线局域网(wlan)规范,由IEEE电气和电子工程师协会的一个工作组开发和维护。802.11是第一个被广泛采用的无线网络标准。802.11是原始的无线规......
  • JavaSE笔记10数组入门
    数组的入门概念数组属于引用数据类型,其父类是Object数组可以容纳多个元素。(数组是一个数据的集合)数组可以存储基本和引用数据类型数组是引用类型,所以存储再堆内存中数组不能直接存储Java对象,但是可以存储其引用(内存地址)分类一维数组二维数组多维数组二维数组本质......
  • maven--一起学习吧之架构
    一、maven是什么Maven是一个项目管理和构建自动化工具,主要用于Java项目。它由Apache软件基金会所提供,不仅是一个构建工具,还是一个依赖管理工具,并且可以通过一套简洁的XML文件来描述项目信息,然后Maven就可以自动执行项目的构建过程。Maven的主要功能包括:依赖管理:Maven可以自......
  • 中间件漏洞攻防学习总结
    前言面试常问的一些中间件,学习总结一下。以下环境分别使用vulhub和vulfocus复现。Apacheapache文件上传(CVE-2017-15715)描述:Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行......
  • 苍穹外卖学习笔记——第二天
    员工管理、分类管理新增员工需求分析和设计产品原型业务规则账号必须是唯一的。手机号为合法的11位手机号码。身份证号为合法的18位身份证号码。密码默认为123456。接口设计本项目约定:管理端发出的请求,统一使用/admin作为前缀,用户端发出的请求,统一使用/user作为前......