标签:imp const -- clu main hive pre memset blog
【最短路】
bool spfa() { memset(vis,0,sizeof(vis)); memset(d,0x3f,sizeof(d)); int head=0,tail=1;q[0]=S;vis[S]=1;d[S]=0; while(head!=tail) { int x=q[head++];if(head>3000)head=0; for(int i=first[x];i;i=e[i].from) if(d[x]+e[i].w<d[e[i].v]) { int y=e[i].v; d[y]=d[x]+e[i].w; if(!vis[y]) { if(d[y]<d[q[head]]){head--;if(head<0)head=3000;q[head]=y;} else{q[tail++]=y;if(tail>3000)tail=0;} vis[y]=1; } } vis[x]=0; } return d[T]; }
【强连通分量】
https://www.byvoid.com/blog/scc-tarjan/
http://www.cnblogs.com/saltless/archive/2010/11/08/1871430.html
void tarjan(int x) { dfn[x]=low[x]=++mark; s[++top]=x;lack[x]=top; for(int i=first[x];i;i=e[i].from) { int y=e[i].v; if(!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); } else if(!col[y])low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]) { color++; for(int i=lack[x];i<=top;i++)col[s[i]]=color; num[color]=top-lack[x]+1; top=lack[x]-1; } } for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
【BZOJ】1051 [HAOI2006]受欢迎的牛(模板)
【边双连通分量】
无向图的割顶判断:
#include<cstdio> #include<algorithm> using namespace std; const int maxn=100000,maxm=100000; struct edge{int u,v,from;}e[maxm*3]; int first[maxn],mark,dfn[maxn],low[maxn],iscut[maxn],tot,n,m; void insert(int u,int v) {tot++;e[tot].v=v;e[tot].u=u;e[tot].from=first[u];first[u]=tot;} void dfs(int x,int fa) { dfn[x]=low[x]=++mark; int child=0; for(int i=first[x];i;i=e[i].from) if(e[i].v!=fa) { int y=e[i].v; if(!dfn[y]) { child++;//important dfs(y,x); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x])iscut[x]=1; } else /*if(dfn[y]<dfn[x])*/low[x]=min(low[x],dfn[y]); } if(fa<0&&child<=1)iscut[x]=0; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); insert(u,v);insert(v,u); } for(int i=1;i<=n;i++)if(!dfn[i])dfs(i,-1); for(int i=1;i<=n;i++)if(iscut[i])printf("%d ",i);printf("\n"); return 0; }
【点双连通分量】
似乎有一些解释不清楚的问题,平时以使用边双连通分量为主。
【LA】5135 Mining Your Own Business
标签:imp const -- clu main hive pre memset blog
原文地址:http://www.cnblogs.com/onioncyc/p/6617915.html