图论

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

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

邻接矩阵的:

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));
            }
        }
    }
}
原文地址:https://www.cnblogs.com/something-for-nothing/p/7797998.html