zoukankan      html  css  js  c++  java
  • 图论

    这是我模板复习的第一天,我打算敲一个就往上粘一个

    首先是图论的一些基本存图方式

    邻接矩阵的:

    int a[MAXN][MANX];
    for(int i=1;i<=m;i++){
        int xx=read();int yy=read();
        a[xx][yy]=1;//单向边 
        a[xx][yy]=1//双向边
    }

    邻接矩阵的:

    struct node{
        int y,next;
    }e[MAXN<<1];
    int linkk[MAXN],len=0;
    inline void insert(int xx,int yy,int vv){
        e[++len].y=yy;e[len].v=vv;e[len].next=linkk[xx];linkk[xx]=len;
    } 
    for(int i=1;i<=m;i++){
        int xx=read();int yy=read();int vv=read();
        insert(xx,yy,vv);//单向边 
        insert(xx,yy,vv);insert(yy,xx,vv);//双向边 
    }

    图论的深搜

    邻接矩阵的

    void dfs(int st){
        vis[st]=1;
        for(int i=1;i<=n;i++){
            if(!vis[i]&&a[st][i]) dfs(i);
        }
    } 
    View Code

    邻接表的:

    void dfs(int st){
        vis[st]=1;
        for(int i=linkk[st];i;i=e[i].next){
            if(!vis[e[i].y]) dfs(e[i].y);
        }
    } 
    View Code

    图的广搜

    邻接矩阵的

    int q[MAXN<<2],head=0,tail=0,vis[MAXN]={};
    void bfs(int st){
        q[++tail]=st;
        vis[st]=1;
        while(head<tail){
            int tn=q[++head];
            for(int i=linkk[tn];i;i=e[i].next){
                if(!vis[e[i].y]) q[++tail]=e[i].y,vis[e[i].y]=1;
            }
        }
    }

    邻接表的

    int q[MAXN<<2],head=0,tail=0,vis[MAXN]={};
    void bfs(int st){
        q[++tail]=st;
        vis[st]=1;
        while(head<tail){
            int tn=q[++head];
            for(int i=linkk[tn];i;i=e[i].next){
                if(!vis[e[i].y]) q[++tail]=e[i].y,vis[e[i].y]=1;
            }
        }
    }
    View Code

    最短路

    spfa:

    int q[MAXN<<2],head=0,tail=0,vis[MAXN]={},dis[MAXN];
    void spfa(int st){
        memset(dis,10,sizeof(dis));
        q[++tail]=st;
        dis[st]=0;
        vis[st]=1;
        while(head<tail){
            int tn=q[++head];
            for(int i=linkk[tn];i;i=e[i].next){
                if(dis[tn]+e[i].v<dis[e[i].y]){
                    dis[e[i].y]=dis[tn]+e[i].v;
                    if(!vis[e[i].y]){
                        q[++tail]=e[i].y;
                        vis[e[i].y]=1;
                    }
                }
            }
            vis[tn]=0;
        }
    }

    双端队列优化的spfa

    void spfa(int st){
    	deque < int > q;
    	vis[st]=1;dis[st]=0;
    	q[++tail]=st;
    	while(!q.empty()){
    		int tn=q.front();q.pop_front();
    		for(int i=linkk[tn];i;i=e[i].next){
    			if(dis[e[i].y]>dis[tn]+e[i].v){
    				dis[e[i].y]=dis[tn]+e[i].v;
    				if(!vis[e[i].y]){
    					if(!q.empty()&&dis[e[i].y]>dis[q.front()]) q.push_front(e[i].y);
    					else q.push_back(e[i].y);
    					vis[e[i].y]=0;
    				}
    			}
    		}
    		vis[tn]=0;
    	}
    }

    dijkstra:

    void dijsktra(int st){
        memset(dis,10,sizeof(dis));
        pii temp=make_pair(0,st);
        q.push(temp); 
        for(int i=1;i<=n;i++){
            while(!q.empty()){
                temp=q.top();
                q.pop();
                if(vis[temp.second]) continue;
                for(int j=linkk[temp.second];j;j=e[j].next){
                    dis[e[j].y]=dis[temp.second]+e[j].v;
                    q.push(make_pair(dis[e[i].y],e[i].y));
                }
            }
        }
    }
  • 相关阅读:
    简易httpserver 和客户端调用
    exe打包简易教程
    图像二值化和显示3D 的算法实现
    gitlab 生成标签
    Nginx 使用小结
    FFMPEG 切片过于占用cpu的问题
    神奇 linux 命令行 窗体穿越
    使用 SSH 在 Linux 上远程调试 .NET Core 实例 演示
    CentOS 7 yum 安装 Nginx 以及 TCP流转发
    Centos7 自动挂载分区硬盘 u盘的操作
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7797998.html
Copyright © 2011-2022 走看看