最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)

这篇具有很好参考价值的文章主要介绍了最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表


前言

最短路Dijkstra,spfa,图论二分图算法AYIT—ACM训练(模板版)
A — Dijkstra
B — spfa/Dijkstra
C — 二分图
D — 二分图
E — 二分图
F — 二分图
G — Dijkstra
H — Topsort


A - Dijkstra Algorithm

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

Dijkstra算法基础模板题

💬 模板演示:

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);

    dist[1]=0;

    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j] && (t==-1 || dist[t] > dist[j]))
                t=j;
        }

        st[t]=true;

        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    return dist[n];

}

0x02 代码实现

朴素版本Dijkstra:

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 510;
int g[N][N];
bool st[N];
int dist[N];
int n,s,f;

int dijkstra()
{
	memset(dist,0x3f,sizeof dist);
	dist[s]=0;
	
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
			if(!st[j] && (t==-1 || dist[t] > dist[j]))
				t=j;
		
		st[t]=true;
		for(int j=1;j<=n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	if(dist[f]==0x3f3f3f3f) return -1;
	return dist[f];
}

int main()
{
	cin>>n>>s>>f;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			if(x==-1) g[i][j]=0x3f3f3f3f;
			else g[i][j]=x;
		}
	}
	
	int t =dijkstra();
	cout<<t<<endl;
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表
spfa算法:
💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
const int N=110,M=110*110;
int n,s,f;
bool st[N];
int h[N],w[M],ne[M],e[M],idx;
int dist[N];

void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int spfa()
{
	memset(dist,0x3f,sizeof dist);
	dist[s]=0;
	queue<int> q;
	q.push(s);
	while(q.size())
	{
		int t = q.front();
		q.pop();
		st[t]=false;
		
		for(int i=h[t];i!=-1;i=ne[i])
		{
			int j=e[i];
			if(dist[j] > dist[t] + w[i])
			{
				dist[j]=dist[t]+w[i];
				if(!st[j])
				{
					q.push(j);
					st[j]=true;
				}
			}
		}
	}
	if(dist[f]==0x3f3f3f3f) return -1;
	else return dist[f];
}

int main()
{
	cin>>n>>s>>f;
	memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int x;
			cin>>x;
			//if(x==-1) continue;
			if(x>0) add(i,j,x);
		}
	}
	cout<<spfa()<<endl;
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

B - 最长路

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

spfa算法基础模板题

💬 模板演示:

int spfa()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    queue<int> q;
    q.push(1);

    while(q.size())
    {
        auto t = q.front();
        q.pop();
        st[t]=false;
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return dist[n];
}

0x02 代码实现

spfa算法:
💬 代码演示:

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
const int N = 1510,INF = 0x3f3f3f3f;
int n,m;
int dist[N];
int g[N][N];
queue<int> q;

void spfa()
{
	memset(dist,-1,sizeof dist);
	dist[1]=0;
	q.push(1);
	while(!q.empty())
	{
		int t = q.front();
		q.pop();
		for(int j=1;j<=n;j++)
		{
			if(g[t][j] && dist[j] < dist[t] + g[t][j])
			{
				dist[j] = dist[t] + g[t][j];
				q.push(j);
			}
		}
	}
	
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=max(g[a][b],c);
	}
	spfa();
	cout<<dist[n]<<endl;
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

C - 二分图最大匹配

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>

using namespace std;

const int N = 510,M=5e4+10;
int n,m,q;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];

void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

bool find(int x)
{
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j = e[i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	cin>>n>>m>>q;
	memset(h,-1,sizeof h);
	while(q--)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) res++;
	}
	cout<<res<<endl;
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

D - 搭配飞行员

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>

using namespace std;
const int N = 110;

int n,m;
int map[N][N];
int match[N];
bool st[N];
vector<int> g[N];
bool find(int x)
{
	for(int i=0;i<g[x].size();++i)
	{
		int j = g[x][i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	scanf("%d %d",&n,&m);
	int a,b;
	while(cin>>a>>b)
	{
		g[a].push_back(b);
	}
	
	int res = 0;
	for(int i=1;i<=m;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) 
		{
			res++;
		}
	}
	
	cout<<res;
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

E - The Perfect Stall

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
const int N = 510,M=5e4+10;
int n,m;
int match[N];
bool st[N];
vector<int> g[N];

bool find(int x)
{
	for(int i=0;i<g[x].size();++i)
	{
		int j = g[x][i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		memset(st,false,sizeof st);
		memset(match,0,sizeof match);
		for(int i=1;i<=n;i++)
		{
			
			g[i].clear();
			int s;
			cin>>s;
			while(s--)
			{
				int q;
				cin>>q;
				g[i].push_back(q);
			}
		}
		int res=0;
		for(int i=1;i<=n;i++)
		{
			memset(st,false,sizeof st);
			if(find(i)) res++;
		}
		cout<<res<<endl;
	}
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

F - Asteroids

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

二分图模板题

💬 模板演示:

//邻接表
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }

    return false;
}
//邻接矩阵
bool find(int x)
{
    for(int i=0;i<g[x].size();++i)
    {
        int j = g[x][i];
        if(!st[j])
        {
            st[j]=true;
            if(match[j]==0 || find(match[j]))
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510,M=5e4+10;
int n,m,q;
int h[N],e[M],ne[M],idx;
int match[N];
bool st[N];

void add(int a,int b)
{
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

bool find(int x)
{
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j = e[i];
		if(!st[j])
		{
			st[j]=true;
			if(match[j]==0 || find(match[j]))
			{
				match[j]=x;
				return true;
			}
		}
	}
	return false;
}

int main()
{
	cin>>n>>m;
	memset(h,-1,sizeof h);
	while(m--)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	int res=0;
	for(int i=1;i<=n;i++)
	{
		memset(st,false,sizeof st);
		if(find(i)) res++;
	}
	cout<<res<<endl;
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

G - Til the Cows Come Home

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

Dijkstra算法基础模板题

💬 模板演示:

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);

    dist[1]=0;

    for(int i=0;i<n;i++)
    {
        int t=-1;
        for(int j=1;j<=n;j++)
        {
            if(!st[j] && (t==-1 || dist[t] > dist[j]))
                t=j;
        }

        st[t]=true;

        for(int j=1;j<=n;j++)
            dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
    if(dist[n]==0x3f3f3f3f) return -1;
    return dist[n];

}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdbool.h>

using namespace std;

const int N=1010,inf = 0x3f3f3f3f;

int n,m;
bool st[N];
int dist[N];
int g[N][N];

int dijkstra()
{
	memset(dist,inf,sizeof(dist));
	dist[1]= 0;
	for(int i=1;i <= n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
			if(!st[j] && (t==-1 || dist[t] > dist[j]))
				t=j;
		
		st[t]=true;
		for(int j=1;j<=n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	return dist[n];
}


int main()
{
	cin>>m>>n;
	memset(g,inf,sizeof g);
	
	for(int i=0;i<m;++i)
	{
		int a,b,c;
		cin>>a>>b>>c; 
		g[a][b]=g[b][a]=min(g[a][b],c);
	}
	cout<< dijkstra() <<endl;
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

H - 拓扑排序

0x00 算法题目

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表

0x01 算法思路

拓扑排序算法基础模板题

💬 模板演示:

bool topsort()
{
    int hh=0,tt=-1;

    for (int i = 1; i <= n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;

    while(hh<=tt)
    {
        int t = q[hh ++ ];

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }
    return tt==n-1;
}

0x02 代码实现

💬 代码演示:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;

const int N=100010;

int n,m;
vector<int> v[N];
int size,d[N];
int ans[N];

void topsort()
{
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++)
		if(!d[i]) q.push(i);
	
	while(!q.empty())
	{
		int t = q.top();
		q.pop();
		ans[size++] = t;
		for(auto it : v[t])
		{
			d[it]--;
			if(!d[it]) q.push(it);
		}
	}
}

int main()
{
	cin>>n>>m;
	
	for(int i=0;i<m;i++)
	{
		int a,b;
		cin>>a>>b;
		v[a].push_back(b);
		d[b]++;
	}
	topsort();
	
	for(int i=0 ; i<size ;i++)
		cout<< 'v' << ans[i] <<' ';
	
	return 0;
}

🚩 运行结果:
最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版),???周训,算法,图论,c++,数据结构,链表


总结

这次训练很明显涉及到了最短路Dijkstra,spfa,图论二分图算法,以及topsort算法,这次考的比较基础,但是让我意识到了,算法必须熟练记忆模板是很重要的。文章来源地址https://www.toymoban.com/news/detail-693876.html

到了这里,关于最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法基础复盘笔记Day06【搜索与图论】—— Dijkstra、bellman-ford、spfa、Floyd

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月22日
    浏览(35)
  • 12.图论1 最短路之dijkstra算法

    二分图 判定:染色法。 性质: 可以二着色。 无奇圈。 树的直径模板 两遍dfs/bfs,证明时反证法的核心是用假设推出矛盾。 设1是一开始随机选的点,s是与其最远的点,证明s是直径的一端。 反证:假设s不是直径的一端,ss是直径的一端。 现在要做的就是证明ss是直径的一端

    2024年02月20日
    浏览(31)
  • 图论算法基础:单源最短路径Dijkstra算法分析

    在 有向带权图 中给定一个起始顶点(源点),Dijkstra算法可以求出 所有其他顶点 到源点的最短路径,Dijkstra算法 不能用于同时含有正负权值的边的图 Source 顶点集合:已经确定 到源点的最短路径 的顶点就会加入 Source 集合中, Source 集合初始时只有源点 dist 数组:用于记录每个顶点到

    2024年02月11日
    浏览(30)
  • 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)

    本篇博客将考察各种最短路径问题。     无权最短路径     Dijkstra 算法     具有负边值的图     无圈图     所有顶点对间的最短路径     最短路径的例子–词梯游戏 输入是一个赋权图:与每条边 (v i , v j ) 相联系的是穿越该边的开销(或称为值

    2023年04月12日
    浏览(29)
  • 二、搜索与图论6:Dijkstra 模板题+算法模板(Dijkstra求最短路 I, Dijkstra求最短路 II,1003 Emergency)

    朴素dijkstra算法 对应模板题:Dijkstra求最短路 I 时间复杂是 O(n^2+m):n 表示点数,m 表示边数 堆优化版dijkstra 对应模板题:Dijkstra求最短路 II 时间复杂度 O(mlogn):n 表示点数,m 表示边数 树是一种特殊的图 ,与图的存储方式相同。 对于无向图中的边ab,存储两条有向边a-b, b-a。

    2024年02月14日
    浏览(27)
  • 图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法

    https://github.com/Chufeng-Jiang/Graph-Theory/tree/main/src/Chapter11_Min_Path 2.4.1 判断某个顶点的连通性 2.4.2 求源点s到某个顶点的最短路径 存放节点编号和距离 这里的缺点就是,更新node时候,会重复添加节点相同的node,但是路径值不一样。不影响最后结果。 更新pre数组 输出路径 初始化两

    2024年02月04日
    浏览(27)
  • 【图论】Dijkstra 算法求最短路 - 构建邻接矩阵(带权无向图)

    题目链接:1976. 到达目的地的方案数

    2024年03月22日
    浏览(31)
  • 单源最短路径(spfa,Dijkstra, bellman-ford)

    目录  Dijkstra 原理:基于贪心。 为什么 Dijkstra 不能处理有负边的情况 Bellman-ford 原理:动态规划, 实质见floyd的另一篇博客 1,能找负环, 2,有变数限制的最短路径 spfa 原理 spfa怎么求负环, 原理:基于贪心。 第一步 初始化距离,dist[1] = 0, 一号点到起点的距离为0, 其他点

    2024年02月04日
    浏览(38)
  • 【蓝桥杯--图论】Dijkstra、Ballman-Ford、Spfa、Floyd

    今日语录: 每一次挑战都是一次成长的机会 如上所示即为做题时应对的方法 引用与稠密图,即mn^2

    2024年01月23日
    浏览(48)
  • 数学建模十大算法04—图论算法(最短路径、最小生成树、最大流问题、二分图)

    一、最短路径问题 从图中的某个顶点出发,到达另一个顶点的 所经过的边的权重之和最小 的一条路径。 1.1 两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,求一条最短铁路线。 1.1.1 Dijkstra算法 迪杰斯特拉(D

    2024年02月02日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包