zoukankan      html  css  js  c++  java
  • 图论

    tarjan缩点找环

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=100007;
    
    int n,m;
    
    struct edge {
        int v,nxt;
    }e[maxn<<1];
    int head[maxn<<1],tot;
    void add_edge(int u,int v) {
        e[++tot].v=v;
        e[tot].nxt=head[u];
        head[u]=tot;
    }
    
    int low[maxn],dfn[maxn],stak[maxn],top,vis[maxn],cnt,color_tot,color[maxn];
    void tarjan(int u) {
        dfn[u]=low[u]=++cnt;
        vis[u]=1;
        stak[++top]=u;
        for(int i=head[u];i;i=e[i].nxt) {
            int v=e[i].v;
            if(!dfn[v])
                tarjan(v),low[u]=min(low[u],low[v]);
            else if(vis[u])
                low[u]=min(low[u],dfn[v]);
        }
        if(dfn[u]==low[u]) {
        	color_tot++;
            vis[u]=0;
            color[u]=color_tot;
            while(stak[top]!=u) {
            	color[stak[top]]=color_tot;
                vis[stak[top]]=0;
                top--;
            }top--;
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;++i) {
            int x,y;
            scanf("%d%d",&x,&y);
            add_edge(x,y);
        }
        for(int i=1;i<=n;++i)
            if(!dfn[i])
         		tarjan(i);
        printf("%d
    ",color_tot);
        return 0;
    }
    

    dijstra

    #include <cstdio>
    #include <queue>
    #define maxn 600010
    #define N 10001
    #define inf 0x7fffffff
    using namespace std;
    struct node {
        int v,q,nxt;
    } e[maxn];
    int head[maxn],tot;
    void add_node(int u,int v,int q) {
        e[++tot].v=v;
        e[tot].q=q;
        e[tot].nxt=head[u];
        head[u]=tot;
    }
    int n,m,S;
    int dis[N],vis[N];
    void dijkstra() {
    	for(int i=1;i<=n;++i) dis[i]=0x7fffffff;
    	dis[S]=0;
    	for(int i=1;i<=n;++i)
    	{
    		int mi=0x7fffffff,t=-1;
    		for(int j=1;j<=n;++j)
    			if(!vis[j]&&dis[j]<mi)
    				mi=dis[j],t=j;
    		if(t==-1) break;
    		vis[t]=1;
    		for(int j=head[t];j;j=e[j].nxt)
    			if(!vis[e[j].v]&&dis[e[j].v]>dis[t]+e[j].q)
    				dis[e[j].v]=dis[t]+e[j].q;
    	}
    }
    int main() {
        scanf("%d%d%d",&n,&m,&S);
        for(int i=1; i<=n; ++i) dis[i]=inf;
        for(int i=1; i<=m; ++i) {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add_node(x,y,z);
        }
     	dijkstra();
        for(int i=1; i<=n; ++i)
            printf("%d ",dis[i]);
        return 0;
    }
    

    堆优化dijkstra

    #include <cstdio>
    #include <queue>
    #define inf 0x7fffffff
    #define M 200007
    #define N 100007
    struct Edge {
    	int v,q,nxt;
    }e[M];
    int head[M],tot,n,m,S,dis[N];
    void add_Edge(int u,int v,int q) {
    	e[++tot].v=v;
    	e[tot].q=q;
    	e[tot].nxt=head[u];
    	head[u]=tot;
    }
    struct node {
    	int x,y;
    	bool operator < (const node& a) const {
    		return y>a.y;
    	}
    };
    void dijkstra() {
    	for(int i=1;i<=n;++i) dis[i]=inf;
    	std::priority_queue<node> q;
    	dis[S]=0;
    	q.push((node){S,0});
    	while(!q.empty()) {
    		node x=q.top();
    		q.pop();
    		if(x.y!=dis[x.x]) continue;
    		for(int i=head[x.x];i;i=e[i].nxt) {
    			int v=e[i].v;
    			if(dis[v]>dis[x.x]+e[i].q) {
    				dis[v]=dis[x.x]+e[i].q;
    				q.push((node){v,dis[v]});
    			}
    		}
    	}
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&S);
    	for(int i=1,x,y,z;i<=m;++i) {
    		scanf("%d%d%d",&x,&y,&z);
    		add_Edge(x,y,z);
    	}
    	dijkstra();
    	for(int i=1;i<=n;++i)
    		printf("%d ",dis[i]);
    	return 0;
    }
    
    

    prim

    #include <cstdio>
    #include <cstring>
    using namespace std;
    int n,m,a[5001][5001],ans[5001],he,pd[5001];
    inline int min(int a,int b) {return a<b?a:b;}
    int main()
    {
    	scanf("%d%d",&n,&m);
    	memset(ans,0x3f,sizeof(ans));
    	memset(a,0x3f,sizeof(a));
    	int x,y,z;
    	for(int i=1;i<=n;++i) {
    		scanf("%d%d%d",&x,&y,&z);
    		a[x][y]=min(a[x][y],z);
    	}
    	ans[1]=0;
    	for(int i=1;i<=n;++i) {
    		int k=0;
    		for(int j=1;j<=n;++j)
    			if(!pd[j]&&ans[k]>ans[j]) k=j;
    		pd[k]=1;
    		for(int j=1;j<=n;++j)
    			if(!pd[j]&&a[k][j]<ans[j])	ans[j]=a[k][j];
    	}
    	for(int i=1;i<=n;++i) {
    		if(!pd[i]) {
    			puts("orz");
    			return 0;
    		}
    		he+=ans[i];	
    	}
    	printf("%d
    ",he);
    	return 0;
    
    
    

    kruskal

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define maxn 400001
    using namespace std;
    int n,m,f[maxn],tot,ans;
    struct Edge{
        int u,v,q;
        inline bool operator < (const Edge &a) const{
            return q<a.q;
        }
    }e[maxn];
    inline void add(int u,int v,int q) {
        e[++tot].u=u;
        e[tot].v=v;
        e[tot].q=q;
    }
    inline int find(int x) {
        return f[x]==x?x:f[x]=find(f[x]);
    }
    inline void uu(int x,int y) {
        f[find(x)]=find(y);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1,a,b,c;i<=m;++i) {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
        for(int i=1;i<=n;++i) f[i]=i;
        sort(e+1,e+1+m);
        tot=0;
        for(int i=1;i<=m;++i) {
            if(find(e[i].u)!=find(e[i].v)) {
                uu(e[i].u,e[i].v);
                tot++;
                ans+=e[i].q;
                if(tot==n-1) break;
            }
        }
        if(tot==n-1) printf("%d
    ",ans);
        else puts("orz");
        return 0;
    }
    
    

    spfa

    #include <cstdio>
    #include <queue>
    #define maxn 600010
    #define N 10001
    #define inf 0x7fffffff
    using namespace std;
    struct node {
    	int v,q,nxt;
    } e[maxn];
    int head[maxn],tot;
    void add_node(int u,int v,int q) {
    	e[++tot].v=v;
    	e[tot].q=q;
    	e[tot].nxt=head[u];
    	head[u]=tot;
    }
    int n,m,S;
    int dis[N],vis[N];
    queue<int> q;
    int main() {
    	scanf("%d%d%d",&n,&m,&S);
    	for(int i=1; i<=n; ++i) dis[i]=inf;
    	for(int i=1; i<=m; ++i) {
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		add_node(x,y,z);
    	}
    	q.push(S);
    	dis[S]=0;
    	while(!q.empty()) {
    		int x=q.front();
    		q.pop();
    		vis[x]=0;
    		for(int i=head[x]; i; i=e[i].nxt) {
    			int v=e[i].v;
    			if(dis[v]>dis[x]+e[i].q) {
    				dis[v]=dis[x]+e[i].q;
    				if(!vis[v]) {
    					vis[v]=1;
    					q.push(v);
    				}
    			}
    		}
    	}
    	for(int i=1; i<=n; ++i)
    		printf("%d ",dis[i]);
    	return 0;
    }
    
    

    路径压缩,按秩合并并查集

    #include <iostream>
    #include <cstdio>
    #define FOR(i,a,b) for(int i=a;i<=b;++i)
    using namespace std;
    const int maxn=1e4+7;
    int read() {
    	int x=0,f=1;char s=getchar();
    	for(;s<'0'||s>'9';s=getchar()) if(s=='-') f=-1;
    	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    	return x*f;
    }
    int n,m,fa[maxn],size[maxn];
    int find(int x) {
    	return fa[x]==x ? x : fa[x]=find(fa[x]);
    }
    void uu(int x,int y) {
    	int fx=find(x),fy=find(y);
    	if(size[fx]<=size[fy]) {
    		fa[fx]=fy;
    		if(size[fx]==size[fy]) size[fy]++;
    	} else {
    		fa[fy]=fx;
    	}
    }
    int main() {
    	n=read(),m=read();
    	FOR(i,1,n) fa[i]=i,size[i]=1;
    	FOR(i,1,m) {
    		int opt=read(),x=read(),y=read();
    		if(opt==1) {
    			uu(x,y);
    		} else {
    			find(x)^find(y) ? puts("N") : puts("Y");
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    在CentOS 8 上 部署 .Net Core 应用程序
    Asp.Net Core 查漏补缺《一》 —— IStartFilter
    接口相关数据日志打印
    退款
    识别身份证
    生成二维码
    打造一款简单易用功能全面的图片上传组件
    Redis过期策略+缓存淘汰策略
    Redis主从复制
    .net 平台常用框架
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/9916632.html
Copyright © 2011-2022 走看看