首页 > 其他分享 >图论

图论

时间:2023-10-16 18:24:24浏览次数:27  
标签:node 图论 int long vis edge dis

Week 9 图论

P5318 【深基18.例3】查找文献

  • 思路:用vector存单向图,排序,深搜光搜

  • 注意:“如果有很多篇文章可以参阅,请先看编号较小的那篇”,需要排序(按终点由小到大排列,终点相同则起点有小到大

    #include<bits/stdc++.h> 
    using namespace std;  
    struct edge{    
    	int u,v;
    }; 
    vector <int> e[100001]; 
    vector <edge> s;
    bool vis1[100001]={0},vis2[100001]={0};
    bool cmp(edge x,edge y)
    {
    	if(x.v==y.v)
    	return x.u<y.u;
    	else return x.v<y.v;
    }
    void dfs(int x)//深搜 
    {
    	vis1[x]=1;
    	cout<<x<<" ";
    	for(int i=0;i<e[x].size();i++){
    		int point=s[e[x][i]].v;
    		if(!vis1[point]){
    			dfs(point);
    		}
    	}
    }
    void bfs(int x) //广搜 
    {  
    	queue <int> q;
    	q.push(x);
    	cout<<x<<" ";
    	vis2[x]=1;
    	while(!q.empty()){
    		int fro=q.front();
    		for(int i=0;i<e[fro].size();i++){
    			int point=s[e[fro][i]].v;
    			if(!vis2[point]){
    				q.push(point); 
    				cout<<point<<" ";
    				vis2[point]=1;
    			}
    		}
    		q.pop();
    	}
    }
    int main(){
    	int n,m; 
    	cin>>n>>m; 
    	for(int i=0;i<m;i++){
    		int x,y;
    		cin>>x>>y;
    		s.push_back((edge){x,y});   
    	}
    	sort(s.begin(),s.end(),cmp); 
    	for(int i=0;i<m;i++)   
    		e[s[i].u].push_back(i); 
    	dfs(1);  
    	cout<<endl;
    	bfs(1); 
    }
    

U80592 【模板】floyd

  • 模板题直接套floyd就行
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const long long t=998244354;
int n,m;
long long f[505][505];
int main()
{
    long long u,v,w;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            f[i][j]=INF;
            f[i][i]=0;
        }
    }
    
    for(int i=0;i<m;i++)
    {
        cin>>u>>v>>w;
        f[u][v]=min(w,f[u][v]);
        f[v][u]=min(w,f[v][u]);
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
            }
        }
    }
    long long ans;
    for(int i=1;i<=n;i++)
    {
        ans=0;
        for(int j=1;j<=n;j++)
        {
            if(f[i][j]!=INF)
            {ans=(ans+f[i][j])%t;}
        }
        cout<<ans<<endl;
    }
}

P4779 【模板】单源最短路径(标准版)

  • 模板题,dijkstra算法
#include <bits/stdc++.h>
using namespace std;

struct edge
{
	int to,w;
	edge(int a,int b){
		to=a;
		w=b;
	}
};

struct node 
{
	int id,s;
	node(int a,int b){
		id=a;
		s=b;
	}
	bool operator >(const node c) const{
		return s>c.s;
	}
};

int n,m,be;
vector <edge> e[100005];
int dis[100005];
bool vis[100005];

void dijkstra(int be)
{
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[be]=0;
	priority_queue <node,vector<node>, greater<node> > Q;
	Q.push(node(be,0));
	while(!Q.empty())
	{
		node nd=Q.top();
		Q.pop();
		if(vis[nd.id])
			continue;
		vis[nd.id]=true;
		for(int i=0;i<e[nd.id].size();++i)
		{
			edge y=e[nd.id][i];
			if(vis[y.to])
				continue;
			if(dis[y.to]>y.w+nd.s) 
			{
				dis[y.to]=y.w+nd.s;
				Q.push(node(y.to,dis[y.to]));
			}
		}
	}
}

int main()
{
	cin>>n>>m>>be;
	for(int i=1;i<=m;++i)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c); 
		e[a].push_back(edge(b,c));
	}
	dijkstra(be);
	for(int i=1;i<=n;++i)
	{
		printf("%d ",dis[i]);
	}
	return 0;
}

标签:node,图论,int,long,vis,edge,dis
From: https://www.cnblogs.com/xiaoyangii/p/17768035.html

相关文章

  • 图论的一些知识
    tarjan算法虚树DAG剖分矩阵树定理最小树形图()斯坦纳树(感觉可以看看?)同余最短路平面图and对偶图线性规划网络流一般图最大匹配Prüfer序列竞赛图稳定婚姻问题2-sat仙人掌Dilworth定理()tarjan算法有向图\(\to\)强连通分量无向图\(\to\)广义圆方树......
  • 搜索与图论2.2-Floyd算法
    一、简述\(Floyd\)算法是一种可以快速求解图上所有顶点之间最短路径的算法。\(Bellman-Ford\)和\(Dijkstra\)算法求解的都是从一个起始点开始的最短路。如果想要求解图中所有顶点之间的最短路,就需要枚举每个点做为起点,这样十分低效。\(Floyd\)算法(也称\(Floyd-Warshall\)......
  • 图论总结
    图论树和图的存储`树是特殊的图,无环的联通图图分为有向图和无向图,无向图是一种特殊的有向图`邻接矩阵存稠密图,空间复杂度\(O(n^2)\)g[u][v]=w;邻接表voidinit(){ for(inti=0;i<N;i++) h[i]=-1;}voidadd(inta,intb){//在链表头插......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)
    CodeforcesRound903(Div.3)F.MinimumMaximumDistance思路对标记点更新fg,从0开始进行bfs,更新d1为所有点到0的距离获得到0最远的标记点L,从L开始bfs,更新d2为所有点到L的距离获得距离L最远的标记点R,从R开始bfs,更新d3为所有点到R的距离遍历所有点,这个点与标记点的最大距......
  • 图论
    \(DFS\)\(DFS\)全称是\(Depth\First\Search\),中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。\(DFS\)最显著的特征在于其递归调用自身。同时与\(BFS\)类似,\(DFS\)会对其访问过的点打上访问标记,在遍历图时跳过已......
  • 图论——树上问题 学习笔记
    图论——树上问题学习笔记目录树的直径树的重心树的中心经典问题1:最小化最大距离树的直径定义树上任意两节点之间最长的简单路径即为树的直径。显然,一棵树可以有多条直径,他们的长度相等。性质若树上所有边边权均为正,则树的所有直径有交,且中点重合;有树的直径\((p,q......
  • 图论
    图论这……感觉是知识点多,算法多,但用的频率不一定高,容易忘记,这里就整点板子防老年痴呆欧拉路径即一笔画问题,定义为:图中经过所有边恰好一次的路径叫欧拉路径。如果此路径的起点和终点相同,则称其为一条欧拉回路。注意图必须连通,可用并查集或dfs判断关于判断欧拉路径是否存在:以......
  • MATLAB图论工具箱(哪有什么工具箱,就只是一堆函数而已)
    MATLAB图论工具箱图论基础Matlab图论工具箱提供了构建、操作和分析图形的函数和工具。在Matlab图论工具箱中,可以使用以下基本数据结构:graph:无向图。digraph:有向图。可以使用以下函数创建一个图或有向图:graph:创建一个无向图。digraph:创建一个有向图。%创建无......
  • 图论总结
    最小生成树相关次小生成树、生成树边替代对于一条非树边\((u,v)\),它替代树\(u,v\)链上的最大值,对答案的影响最小。用倍增或树链剖分维护。对于一条树边,如果非树边\((u,v)\)满足这条边在链\(u,v\)上,它被满足这个条件的权值最小的边替代对答案的影响最小。把非树边按权值......
  • 【图论】【寻找性质】CF1151E Number of Components 题解
    CF1151E发现每一个\(f(l,r)\)中的连通块总是一条链(一棵树)。那么此时连通块的数量就等于点的数量减去边的数量。先考虑点的总数,一个价值为\(a_i\)的点一定是在\(l\leqslanta_i\)且\(r\geqslanta_i\)的\(f(l,r)\)中才会有一个贡献,根据乘法原理,它会产生\(a_i\time......