大体按照 数学 图论 dp 数据结构 这样的顺序

模板集 这个真的只有模板了………………

·spfa

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
ll n,m,k,l,a,b,c,d[maxn],s,visit[maxn];
struct edge{int from,to,val;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t,int v){
g[f].push_back(k);edges.push_back({f,t,v});k+=;
}void spfa(int s){
for(int i=;i<=n;i++)d[i]=;queue<int>q;q.push(s);
visit[s]=,d[s]=;
while(!q.empty()){int u=q.front();q.pop();visit[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(d[e.to]>d[u]+e.val){d[e.to]=d[u]+e.val;
if(!visit[e.to])q.push(e.to),visit[e.to]=;
}
}
}
}
int main(){
cin>>n>>m>>s;for(int i=;i<=m;i++)cin>>a>>b>>c,add_edge(a,b,c);spfa(s);
for(int i=;i<=n;i++)cout<<d[i]<<" ";
}

判负圈和差分约束系统

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
ll n,m,k=,l,a,b,c,d[maxn],s,visit[maxn],inv[maxn];
struct edge{int from,to,val;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t,int v){
g[f].push_back(k);edges.push_back({f,t,v});k+=;
}bool spfa(int s){
for(int i=;i<maxn;i++)d[i]=;queue<int>q;q.push(s);
visit[s]=,d[s]=;
while(!q.empty()){int u=q.front();q.pop();visit[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(d[e.to]>d[u]+e.val){d[e.to]=d[u]+e.val;
if(inv[e.to]>n)return ;
if(!visit[e.to])q.push(e.to),visit[e.to]=,inv[e.to]++;
}
}
}return ;
}
int main(){
cin>>l;while(l--){
cin>>n>>m;memset(visit,,sizeof(visit));memset(inv,,sizeof(inv));
for(int i=;i<=m;i++){cin>>a>>b>>c;
add_edge(a,b,c);if(c>=)add_edge(b,a,c);
}
if(spfa())cout<<"YE5"<<endl;else cout<<"N0"<<endl;
edges.clear();k=;for(int i=;i<maxn;i++)g[i].clear();
}
}

·dj

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005 ll n,m,k,l,a,b,c,d[maxn],s,visit[maxn];
struct edge{int from,to,val;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t,int v){
g[f].push_back(k);edges.push_back({f,t,v});k+=;
} struct node{int u,d;
bool operator <(node b)const{
return d>b.d;
}
};
void dj(int s){
for(int i=;i<=n;i++)d[i]=;priority_queue<node>q;q.push({s,});
visit[s]=,d[s]=;
while(!q.empty()){int u=q.top().u;q.pop();visit[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(d[e.to]>d[u]+e.val){d[e.to]=d[u]+e.val;
if(!visit[e.to])q.push({e.to,d[e.to]}),visit[e.to]=;
}
}
}
} int main(){
cin>>n>>m>>s;
for(int i=;i<=m;i++)scanf("%lld%lld%lld",&a,&b,&c),add_edge(a,b,c);
dj(s);for(int i=;i<=n;i++)printf("%lld ",d[i]);
return ;
}

·网络流

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
#define inf 2000000000
ll n,m,k=,l,a,b,c,d[maxn],s,t,visit[maxn],p[maxn],cur[maxn];
struct edge{int from,to,cap,flow;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t,int v){g[f].push_back(k);edges.push_back({f,t,v,});k+=;g[t].push_back(k);edges.push_back({t,f,,});k+=;}
bool bfs(){queue<int>q;q.push(s);visit[s]=;
for(int i=;i<=n;i++)d[i]=inf;d[s]=;
while(!q.empty()){int u=q.front();q.pop();visit[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(e.cap>e.flow&&d[e.to]>d[u]+){d[e.to]=d[u]+;
if(!visit[e.to])q.push(e.to),visit[e.to]=;
}
}
}return d[t]!=inf;
}
ll dfs(int x,int a){if(a==||x==t)return a;ll f=,flow=;
for(ll &i=cur[x];i<g[x].size();i++){edge &e=edges[g[x][i]];
if(d[e.to]==d[x]+&&(f=dfs(e.to,min(a,e.cap-e.flow)))){
flow+=f,e.flow+=f,edges[g[x][i]^].flow-=f;a-=f;
}
}return flow;
}
ll mf(ll s,ll t){ll flow=;
while(bfs()){memset(cur,,sizeof(cur));
flow+=dfs(s,inf);
}return flow;
}
int main(){cin>>n>>m>>s>>t;
for(int i=;i<=m;i++)cin>>a>>b>>c,add_edge(a,b,c);
cout<<mf(s,t)<<endl;return ;
}

·费用流

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 100005
#define inf 2000000000
ll n,m,k=,l,aa,a[maxn],b,c,e,d[maxn],s,t,visit[maxn],p[maxn],cur[maxn],flow=,cost=;
struct edge{ll from,to,cap,flow,cost;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t,int v,int c){g[f].push_back(k);edges.push_back({f,t,v,,c});k+=;
g[t].push_back(k);edges.push_back({t,f,,,-c});k+=;}
ll bfs(){queue<int>q;q.push(s);visit[s]=;a[s]=inf;
for(int i=;i<=n;i++)d[i]=inf;d[s]=;
while(!q.empty()){int u=q.front();q.pop();visit[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){d[e.to]=d[u]+e.cost;p[e.to]=g[u][i];
a[e.to]=min(a[u],e.cap-e.flow);
if(!visit[e.to])q.push(e.to),visit[e.to]=;
}
}
}
if(d[t]==inf)return ;
flow+=(long long)*a[t];
cost+=(long long)*d[t]*a[t];int u=t;
while(u!=s){
edges[p[u]].flow+=a[t];edges[p[u]^].flow-=a[t];
u=edges[p[u]].from;
}
return true;
}
int main(){cin>>n>>m>>s>>t;
for(int i=;i<=m;i++)cin>>aa>>b>>c>>e,add_edge(aa,b,c,e);
while(bfs());
cout<<flow<<" "<<cost<<endl;
return ;
}

·kruscall

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 2000005
struct edge{int from,to,val;}e[maxn];
bool cmp(edge a,edge b){return a.val<b.val;}
ll n,m,k,l,a,b,c,fa[maxn],val=;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void join(int x,int y){fa[find(x)]=find(y);}
int main(){cin>>n>>m;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)cin>>e[i].from>>e[i].to>>e[i].val;
sort(e+,e+m+,cmp);
for(int i=;i<=m;i++){
if(find(e[i].from)==find(e[i].to))continue;
else join(e[i].from,e[i].to),val+=e[i].val;
}cout<<val<<endl;
return ;
}

·倍增lca

 #include<bits/stdc++.h>
using namespace std;
#define maxn 500005
#define ll long long
int n,m,k,l,a,b,s,c,fa[maxn][],depth[maxn],visit[maxn];
struct edge{int from,to;};vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t){g[f].push_back(k);g[t].push_back(k+);
edges.push_back({f,t});edges.push_back({t,f});k+=;
}void dfs(int u){visit[u]=;fa[s][]=s;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(visit[e.to])continue;depth[e.to]=depth[u]+;fa[e.to][]=u;dfs(e.to);
}
}int lca(int a,int b){if(depth[a]<depth[b])swap(a,b);
for(int i=;i>=;i--)if(depth[fa[a][i]]>=depth[b])a=fa[a][i];if(a==b)return a;
for(int i=;i>=;i--)if(fa[a][i]!=fa[b][i])a=fa[a][i],b=fa[b][i];return fa[a][];
}
int main(){cin>>n>>m>>s;
for(int i=;i<n;i++)scanf("%d%d",&a,&b),add_edge(a,b);
dfs(s);
for(int j=;j<=;j++)for(int i=;i<=n;i++)fa[i][j]=fa[fa[i][j-]][j-];
for(int i=;i<=m;i++)scanf("%d%d",&a,&b),printf("%d\n",lca(a,b));
}

·树剖

 #include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define lson (node<<1)
#define rson (lson|1)
int n,m,k=,num=,a,b,c,s[maxn],depth[maxn],top[maxn],val[maxn],fa[maxn],id[maxn],idx[maxn],sz[maxn],wson[maxn],visit[maxn];
struct edge{int from,to;};vector<edge>edges;vector<int>g[maxn];
void add_edge(int f,int t){g[f].push_back(k);g[t].push_back(k+);k+=;edges.push_back({f,t});edges.push_back({t,f});}
int treesum[maxn*],treemax[maxn*];
inline int rd(){int res=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){res=res*+(ch&);ch=getchar();}return f*res;
}void pushdown(int node){treemax[node]=max(treemax[lson],treemax[rson]);treesum[node]=treesum[lson]+treesum[rson];}
void dfs1(int u){visit[u]=;sz[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];if(visit[e.to])continue;depth[e.to]=depth[u]+,fa[e.to]=u;
dfs1(e.to);sz[u]+=sz[e.to];if(sz[e.to]>sz[wson[u]])wson[u]=e.to;}
}void dfs2(int u){visit[u]=,id[u]=++num,idx[num]=u;
if(wson[u]!=)top[wson[u]]=top[u],dfs2(wson[u]);
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(visit[e.to]||wson[u]==e.to)continue;top[e.to]=e.to;dfs2(e.to);}
}void build(int node,int l,int r){if(l==r){treesum[node]=treemax[node]=val[idx[l]];return ;}int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);pushdown(node);
}void add(int node,int l,int r,int x,int k){if(l==r){treemax[node]=treesum[node]=k;return ;}int mid=(l+r)>>;
if(x<=mid)add(lson,l,mid,x,k);else if(x>=mid+)add(rson,mid+,r,x,k);pushdown(node);
}int querysum(int node,int l,int r,int x,int y){
if(l==x&&r==y){return treesum[node];}int mid=(l+r)>>;
if(y<=mid)return querysum(lson,l,mid,x,y);else if(x>=mid+)return querysum(rson,mid+,r,x,y);
else return querysum(lson,l,mid,x,mid)+querysum(rson,mid+,r,mid+,y);
}int querymax(int node,int l,int r,int x,int y){
if(l==x&&r==y){return treemax[node];}int mid=(l+r)>>;
if(y<=mid)return querymax(lson,l,mid,x,y);else if(x>=mid+)return querymax(rson,mid+,r,x,y);
else return max(querymax(lson,l,mid,x,mid),querymax(rson,mid+,r,mid+,y));
}
int findmax(int u,int v){int ans=-;
while(top[u]!=top[v]){if(depth[top[u]]<depth[top[v]])swap(u,v);
ans=max(ans,querymax(,,n,id[top[u]],id[u]));u=fa[top[u]];}
if(depth[u]<depth[v])swap(u,v);ans=max(ans,querymax(,,n,id[v],id[u]));return ans;
}int findsum(int u,int v){int ans=;
while(top[u]!=top[v]){if(depth[top[u]]<depth[top[v]])swap(u,v);
ans+=querysum(,,n,id[top[u]],id[u]);u=fa[top[u]];
}if(depth[u]<depth[v])swap(u,v);ans+=querysum(,,n,id[v],id[u]);return ans;
}
int main(){n=rd();for(int i=;i<n;i++)a=rd(),b=rd(),add_edge(a,b);
dfs1();memset(visit,,sizeof(visit));dfs2();
for(register int i=;i<=n;i++)val[i]=rd();
m=rd();build(,,n);
for(register int i=;i<=m;i++){string hh;cin>>hh;
if(hh=="QMAX")a=rd(),b=rd(),printf("%d\n",findmax(a,b));
if(hh=="QSUM")a=rd(),b=rd(),printf("%d\n",findsum(a,b));
if(hh=="CHANGE")a=rd(),b=rd(),add(,,n,id[a],b);
}return ;
}

·lct

 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct node{int fa,ch[];bool reverse,is_root;}T[maxn];
int n,m;
void pushreverse(int x){if(!x)return;swap(T[x].ch[],T[x].ch[]);T[x].reverse^=;}
void pushdown(int x){
if(T[x].reverse){
pushreverse(T[x].ch[]),pushreverse(T[x].ch[]),T[x].reverse=false;
}
}int getson(int x){return x==T[T[x].fa].ch[];}
void rotate(int x){if(T[x].is_root)return;
int k=getson(x),fa=T[x].fa;
int fafa=T[fa].fa;
T[fa].ch[k]=T[x].ch[k^];
if(T[x].ch[k^])T[T[x].ch[k^]].fa=fa;
T[x].ch[k^]=fa,T[fa].fa=x,T[x].fa=fafa;
if(!T[fa].is_root)T[fafa].ch[fa==T[fafa].ch[]]=x;
else T[x].is_root=true,T[fa].is_root=false;
}void push(int x){if(!T[x].is_root)push(T[x].fa);pushdown(x);}
void splay(int x){push(x);
for(int fa;!T[x].is_root;rotate(x)){
if(!T[fa=T[x].fa].is_root){
rotate((getson(x)==getson(fa))?fa:x);
}
}
}void access(int x){
int y=;do{
splay(x);T[T[x].ch[]].is_root=true;
T[T[x].ch[]=y].is_root=false;x=T[y=x].fa;
}while(x);
}bool judge(int u,int v){
while(T[u].fa)u=T[u].fa;while(T[v].fa)v=T[v].fa;
return u==v;
}void mroot(int x){access(x);splay(x);pushreverse(x);}
void link(int u,int v){mroot(u);T[u].fa=v;}
void cut(int u,int v){mroot(u);access(v);splay(v);
T[T[v].ch[]].fa=T[v].fa;
T[T[v].ch[]].is_root=true;
T[v].fa=;T[v].ch[]=;
}void work(){
char opt[];int u,v;
while(m--){cin>>opt>>u>>v;
if(opt[]=='Q'){
if(judge(u,v))printf("Yes\n");
else printf("No\n");
}else if(opt[]=='C')link(u,v);else if(opt[]=='D')cut(u,v);
}
}int main(){cin>>n>>m;
for(int i=;i<=n;i++){
T[i].reverse=T[i].fa=T[i].ch[]=T[i].ch[]=;T[i].is_root=true;
}work();return ;
}

·无向图tarjan只割顶 桥

·流图tarjan

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 10005
int n,m,k,l,a,b,c,val[maxn],scc[maxn],cnt=,num=,dfn[maxn],low[maxn],ins[maxn],sz[maxn],in[maxn],out[maxn],d[maxn],mx=-;
struct edge{int from,to;};vector<edge>edges;vector<int>g[maxn];vector<edge>edges2;vector<int>mp[maxn];
void add_edge(int f,int t){g[f].push_back(k++),edges.push_back({f,t});}
stack<int>s;queue<int>q;
void tarjan(int u){dfn[u]=low[u]=++num;s.push(u);ins[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(!dfn[e.to]){tarjan(e.to);
low[u]=min(low[u],low[e.to]);
}else if(ins[e.to]){
low[u]=min(low[u],low[e.to]);
}
}if(dfn[u]==low[u]){cnt++;int now;
do{ now=s.top();s.pop();ins[now]=;
scc[now]=cnt,sz[cnt]+=val[now];
}while(now!=u);
}
}
int main(){
cin>>n>>m;for(int i=;i<=n;i++)cin>>val[i];for(int i=;i<=m;i++)cin>>a>>b,add_edge(a,b);
for(int i=;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<edges.size();i++){edge &e=edges[i];
if(scc[e.to]!=scc[e.from])
mp[scc[e.from]].push_back(l++),edges2.push_back({scc[e.from],scc[e.to]}),
in[scc[e.to]]++,out[scc[e.from]]++;
}
for(int i=;i<=cnt;i++)if(!in[i])q.push(i),d[i]=sz[i];
while(!q.empty()){int u=q.front();q.pop();
for(int i=;i<mp[u].size();i++){
edge &e=edges2[mp[u][i]];
in[e.to]--;d[e.to]=max(d[e.to],d[u]+sz[e.to]);
if(in[e.to]==){
q.push(e.to);
}
}
}for(int i=;i<=cnt;i++)mx=max(d[i],mx);
cout<<mx<<endl;
}

·2-sat

 // luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define maxn 2000005
int n,m,k=,l,a,b,c,d,num=,root,cnt=,ins[maxn],val[maxn],dfn[maxn],low[maxn],scc[maxn];
struct edge{int from,to;};
vector<edge>edges;vector<int>g[maxn];stack<int>s;
void tarjan(int u){
s.push(u);ins[u]=;dfn[u]=low[u]=++num;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(!dfn[e.to]){tarjan(e.to);
low[u]=min(low[u],low[e.to]);
}else if(ins[e.to])low[u]=min(low[u],low[e.to]);
}if(dfn[u]==low[u]){int y;cnt++;
do{y=s.top();s.pop();
scc[y]=cnt,ins[y]=;
}while(u!=y);
}
}
int main(){scanf("%d%d",&n,&m);
for(register int i=;i<=m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
edges.push_back({c+((-d)*n),a+(b*n)});
edges.push_back({a+((-b)*n),c+(d*n)});
g[c+((-d)*n)].push_back(k);
g[a+((-b)*n)].push_back(k+);k+=;
}
for(register int i=;i<=*n;i++)if(!dfn[i])tarjan(i);
for(register int i=;i<=n;i++){
if(scc[i]==scc[i+n]){printf("IMPOSSIBLE\n");return ;}
else val[i]=scc[i]>scc[i+n];
}
printf("POSSIBLE\n");
for(register int i=;i<=n;i++)printf("%d ",val[i]);
return ;
}

·点分(这个考就没意思了………………)打的聪聪可可那个

 #include<bits/stdc++.h>
using namespace std;
#define maxn 20005
struct edge{int from,to,val;};
vector<int>g[maxn];vector<edge>edges;
int n,m,k=,a,b,c,d[maxn],root,done[maxn],sz[maxn],msz[maxn],tag[maxn],sum,visit[maxn],ans=;
void add_edge(int f,int t,int v){g[f].push_back(k);edges.push_back({f,t,v%});g[t].push_back(k+);edges.push_back({t,f,v%});k+=;}
int gcd(int a,int b){return b==?a:gcd(b,a%b);}
void dfs(int u){visit[u]=;msz[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(visit[e.to]||done[e.to])continue;
dfs(e.to);sz[u]+=sz[e.to];msz[u]=max(sz[e.to],msz[u]);
}msz[u]=max(sum-sz[u],msz[u]);
if(msz[root]>msz[u]||root==)root=u;
}void dfs2(int u){visit[u]=;tag[d[u]]++;
for(int i=;i<g[u].size();i++){
edge &e=edges[g[u][i]];if(visit[e.to]||done[e.to])continue;
d[e.to]=d[u]+e.val;d[e.to]%=;dfs2(e.to);
}
}int cal(int u,int v){tag[]=tag[]=tag[]=,d[u]=v,dfs2(u);
memset(visit,,sizeof(visit));memset(d,,sizeof(d));
return tag[]*tag[]*+tag[]*tag[];
}void solve(int s){ans+=cal(s,);done[s]=;
for(int i=;i<g[s].size();i++){edge &e=edges[g[s][i]];
if(done[e.to])continue;
ans-=cal(e.to,e.val),root=,sum=sz[e.to];
for(int i=;i<=n;i++)sz[i]=;
memset(msz,,sizeof(msz));dfs(e.to);
memset(visit,,sizeof(visit));solve(root);
}
}int main(){cin>>n;sum=n;for(int i=;i<=n;i++)sz[i]=;
for(int i=;i<n;i++)scanf("%d%d%d",&a,&b,&c),add_edge(a,b,c);
dfs(),memset(visit,,sizeof(visit)),solve(root);
int dd=gcd(ans,n*n);cout<<ans/dd<<"/"<<n*n/dd<<endl;
}

·拓扑排序和基环树

 #include<bits/stdc++.h>
using namespace std;
#define mod 80112002
#define ll long long
#define maxn 100005
ll n,m,k,l,in[maxn],out[maxn],visit[maxn],a,b,f[maxn];
struct edge{int from,to,val;};
vector<int>g[maxn];vector<edge>edges;
void add_edge(int f,int t){g[f].push_back(k++);edges.push_back({f,t});in[b]++,out[a]++;}
void dfs(int u){visit[u]=;
for(int i=;i<g[u].size();i++){
edge &e=edges[g[u][i]];f[e.to]+=f[u],f[e.to]%=mod;if(--in[e.to]==)dfs(e.to);
}
}
int main(){cin>>n>>m;for(int i=;i<=m;i++)cin>>a>>b,add_edge(a,b);
for(int i=;i<=n;i++){
if(!in[i]&&out[i]&&!visit[i])f[i]=,dfs(i);
}for(int i=;i<=n;i++){if(!out[i])l+=f[i],l%=mod;}cout<<l%mod<<endl;
return ;
}

·缩点

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 10005
int n,m,k,l,a,b,c,val[maxn],scc[maxn],cnt=,num=,dfn[maxn],low[maxn],ins[maxn],sz[maxn],in[maxn],out[maxn],d[maxn],mx=-;
struct edge{int from,to;};vector<edge>edges;vector<int>g[maxn];vector<edge>edges2;vector<int>mp[maxn];
void add_edge(int f,int t){g[f].push_back(k++),edges.push_back({f,t});}
stack<int>s;queue<int>q;
void tarjan(int u){dfn[u]=low[u]=++num;s.push(u);ins[u]=;
for(int i=;i<g[u].size();i++){edge &e=edges[g[u][i]];
if(!dfn[e.to]){tarjan(e.to);
low[u]=min(low[u],low[e.to]);
}else if(ins[e.to]){
low[u]=min(low[u],low[e.to]);
}
}if(dfn[u]==low[u]){cnt++;int now;
do{ now=s.top();s.pop();ins[now]=;
scc[now]=cnt,sz[cnt]+=val[now];
}while(now!=u);
}
}
int main(){
cin>>n>>m;for(int i=;i<=n;i++)cin>>val[i];for(int i=;i<=m;i++)cin>>a>>b,add_edge(a,b);
for(int i=;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<edges.size();i++){edge &e=edges[i];
if(scc[e.to]!=scc[e.from])
mp[scc[e.from]].push_back(l++),edges2.push_back({scc[e.from],scc[e.to]}),
in[scc[e.to]]++,out[scc[e.from]]++;
}
for(int i=;i<=cnt;i++)if(!in[i])q.push(i),d[i]=sz[i];
while(!q.empty()){int u=q.front();q.pop();
for(int i=;i<mp[u].size();i++){
edge &e=edges2[mp[u][i]];
in[e.to]--;d[e.to]=max(d[e.to],d[u]+sz[e.to]);
if(in[e.to]==){
q.push(e.to);
}
}
}for(int i=;i<=cnt;i++)mx=max(d[i],mx);
cout<<mx<<endl;
}

noip_最后一遍_2-图论部分的更多相关文章

  1. noip_最后一遍_1-数学部分

    它就是要来了 noip数论一般会以三种形式呈现 注 码风可能有些毒 (有人说我压行qwq) 大概保持标准三十五行左右 为什么是三十五行呢 因为我喜欢这个数字 我喜欢三十五而已(足球球衣也会用这个号哒) ...

  2. noip_最后一遍_3-数据结构

    noip基础数据结构太多了又太捞了 所以也就那么几个了 单调队列滑动窗口 #include<bits/stdc++.h> using namespace std; #define maxn ...

  3. [OI笔记]杂题整理1(基础篇~)

    算是开学第四周啦,之前的三周大概过了一遍基础图论和数学相关的内容.这篇随笔打算口胡一些近期做感觉比较好的数学相关的题目 因为这段时间主要是看紫书学的,所以其实会有些出自UVA的例题,如果需要题目但是觉 ...

  4. 图论4——探索网络流的足迹:Dinic算法

    1. 网络流:定义与简析 1.1 网络流是什么? 网络流是一种"类比水流的解决问题方法,与线性规划密切相关"(语出百度百科). 其实,在信息学竞赛中,简单的网络流并不需要太高深的数 ...

  5. 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论

    依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...

  6. D1图论最短路专题

    第一题:poj3660 其实是Floyed算法的拓展:Floyd-Wareshall.初始时,若两头牛关系确定则fij = 1. 对于一头牛若确定的关系=n-1,这说明这头牛的排名是确定的. 通过寻找 ...

  7. POJ 3159 Candies (图论,差分约束系统,最短路)

    POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...

  8. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  9. (转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!

    ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO ht ...

随机推荐

  1. hadoop 2.5.1单机安装部署伪集群

    环境:ubuntu 14.04 server 64版本 hadoop 2.5.1 jdk 1.6 部署的步骤主要参考了http://blog.csdn.net/greensurfer/article/ ...

  2. 【Luogu P1502】 窗口的星星

    →传送窗口 (复制一下题面好了~) 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户,天真的小 ...

  3. LVS 负载均衡器总结

    下面部分原理部分,是从网上摘录,源网址已经无从获取,我将其中一小部分模糊的说明加入了一些自己的理解,仅最大可能让全文容易阅读,也方便自己以后参考,若你是大牛希望能给我一些宝贵的建议,将理解有误的地方加 ...

  4. sql server 2012 导出sql文件

    导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...

  5. java数据结构----哈希表

    1.哈希表:它是一种数据结构,可以提供快速的插入操作和查找操作.如果哈希表中有多少数据项,插入和删除操作只需要接近常量的时间.即O(1)的时间级.在计算机中如果需要一秒内查找上千条记录,通常使用哈希表 ...

  6. python元组,列表,字典练习

    #coding = utf-8 goods_data = (["iphone7",8000],["mac pro",12000],["bike&quo ...

  7. 转 shell模拟数据库的读写

    0.create table create table myTestTable as select rownum as id,               to_char(sysdate + rown ...

  8. Haproxy常见用法

    简介 HAProxy 提供高可用性.负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机, 它是免费.快速并且可靠的一种解决方案. HAProxy 特别适用于那些负载特大的 web 站点, ...

  9. Connection conn = DriverManager.getConnection("jdbc:odbc:bbs");

    Connection conn = DriverManager.getConnection("jdbc:odbc:bbs"); 这是JDBC连接数据库的时候用的一句话,,Conne ...

  10. 删除所有约束、表、视图等SQL脚本

    --删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...