这是我模板复习的第一天,我打算敲一个就往上粘一个
首先是图论的一些基本存图方式
邻接矩阵的:
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)); } } } }