• 图论


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

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

    邻接矩阵的:

    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));
                }
            }
        }
    }
  • 相关阅读:
    Opencv 图片边缘检测和最小外接矩形
    python matplotlib包图像配色方案
    python matplotlib 绘图 和 dpi对应关系
    python 工具 二进制文件处理之——去掉指定长度数据包头
    python 工具 二进制文件处理之——大小端变换
    Prime Path(POJ 3126 BFS)
    Travel(HDU 5441 2015长春区域赛 带权并查集)
    树上战争(HDU 2545 并查集求解点到根节点长度)
    More is better(hdu 1856 计算并查集集合中元素个数最多的集合)
    How Many Tables(POJ 1213 求连通分量)
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7797998.html
Copyright © 2020-2023  润新知