• 图论


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

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

    邻接矩阵的:

    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));
                }
            }
        }
    }
  • 相关阅读:
    转载两篇文章之二(从程序员到CTO所要培养的六种能力)作者:阿蒙 原文:http://blog.csdn.net/harrymeng/archive/2007/02/07/1503931.aspx
    关于解决eclipse中的插件依赖
    GMF中控制Figure的大小和位置
    Sql server2005中如何格式化时间日期
    JavaScript创建对象的几种方式
    FCK编辑器焦点问题
    对引用类型的一点理解
    利用XML FOR PATH 合并分组信息
    [译]Silverlight中TreeView增删改查和拖放
    KeyedCollection<TKey, TItem>与IDictionary<TKey, TValue>的区别
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7797998.html
Copyright © 2020-2023  润新知