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