其他分享
首页 > 其他分享> > 图论baozi

图论baozi

作者:互联网

1.堆优化的dij

2.spfa:处理带有负权边和环的最短路算法

2.1适用spfa算法判断负环:

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cctype>

using namespace std;

const int maxn=1e5+10;

int head[maxn],nex[maxn],wei[maxn],ver[maxn],tot;
int n,m;
bool st[maxn];
int dis[maxn],cnt[maxn];
queue<int>q;

inline int read()
{
    int x=0,b=1;char c=getchar();
    while(!isdigit(c)) b=c=='-'?-1:1,c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    return x*b;
}
inline void add(int x,int y,int w)
{
    ver[++tot]=y;
    wei[tot]=w;
    nex[tot]=head[x];
    head[x]=tot;
}
inline bool spfa()
{
    for(int i=1;i<=n;i++)
    {
        st[i]=true;
        q.push(i);
    }
    while(q.size())
    {
        int x=q.front();
        q.pop();
        st[x]=false;
        for(int i=head[x];i;i=nex[i])
        {
            int y=ver[i];
            if(dis[y]>dis[x]+wei[i])
            {
                dis[y]=dis[x]+wei[i];
                cnt[y]=cnt[x]+1;
                if(cnt[y]==n) return true;
                if(!st[y])
                {
                    st[y]=true;
                    q.push(y);
                }
            }
        }
    }
    return false;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        a=read(),b=read(),c=read();
        add(a,b,c);
    }
    if(spfa()) printf("Yes");
    else printf("No");
   // for(int i=1;i<=n;i++) printf("%d ",dis[i]);
    return 0;
}
View Code

3.最近公共祖先:

3.1倍增求lca(预处理O(nlogn)查询O(logn))

3.2离线求lca(感觉没有什么用)trajan求lcaO(n+m)

4.拓扑排序:

4.1 差分约束问题:(求最长路)【边权无限制】spfaO(km)

如果说所以边权都是非负的:强联通分量求解(有向图trajan)

如果说所有边权都是1的话,就可以使用拓扑排序来求解

 

标签:图论,int,head,tot,baozi,maxn,include,dis
来源: https://www.cnblogs.com/ILHYJ/p/13770156.html