写篇博客,以免忘记。
c++ stack,queue用法
分别包含在文件<stack>,<queue>
stack的方法:
push():向容器顶部里插入元素;
pop():是删除容器顶部的元素;
top():返回容器顶部的元素;
size():返回容器的元素个数;
begin():是返回一个位于容器的第一个元素的迭代器;
end():返回一个位于容器的最后一个元素;
empty():检查是否为空
queue的用法,它和stack很像:
back():返回队列最后一个元素引用
empty():检查是否为空的
front():获得队列最前面一个元素引用
push():在队列尾添加一个数据
pop():删除队列头的一个数据
size():队列中元素个数
附上第一次打stake的程序:
Jzoj4686. 【NOIP2016提高A组8.12】通讯
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define fd(i,a,b) for (int i=a;i>=b;i--)
#define N 50005
#define INF 2147483647
using namespace std;
stack<int> S;
int t[N*2],last[N*2],next[N*2],value[N*2],dfn[N],low[N],rd[N],Qy[N],l=0;
bool bz[N],v[N];
int tot,top,cnt;
inline int read()
{
int x=0,w=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*w;
}
void add(int x,int y,int z)
{
t[++l]=y;
next[l]=last[x];
value[l]=z;
last[x]=l;
}
void Tarjan(int x)
{
S.push(x);
dfn[x]=low[x]=++tot;
bz[x]=true;
for (int k=last[x];k;k=next[k])
{
int v=t[k];
if (dfn[v]==0)
{
Tarjan(v);
low[x]=min(low[v],low[x]);
}
else if (bz[v] && dfn[v]<low[x]) low[x]=dfn[v];
}
if (low[x]==dfn[x])
{
for (int v;1;)
{
v=S.top();
rd[v]=cnt;
bz[v]=false;
S.pop();
if (v==x) break;
}
cnt++;
}
}
int main()
{
int n,m;
while (true)
{
n=read();m=read();
if (n==0 && m==0) break;
fill(last,last+n,0);
l=0,cnt=0,tot=0,top=0;
fo(i,1,m)
{
int x,y,z;
x=read();y=read();z=read();
add(x,y,z);
}
memset(bz,false,sizeof(bz));
memset(dfn,0,sizeof(dfn));
while(!S.empty()) S.pop();
fo(i,0,n-1) if (dfn[i]==0) Tarjan(i);
fo(i,0,cnt-1) Qy[i]=INF;
fo(i,0,n-1)
{
int u=rd[i];
for (int k=last[i];k;k=next[k])
{
int v=rd[t[k]];
if (u!=v) Qy[v]=min(Qy[v],value[k]);
}
}
int Ans=0;
fo(i,0,cnt-1)
{
if (i==rd[0]) continue;
Ans += Qy[i];
}
printf("%d\n",Ans);
}
return 0;
}
比较完整的
资料:
Stake