1002 Warm up
这题不难,关键是怎么去缩点和扩栈。
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXN 200006
#define MAXM 2000006
#pragma comment(linker, "/STACK:1024000000,1024000000")
struct node {
int v, w, pre;
} edge[MAXM];
int pos[MAXN], nEdge; //图的存储:链式前向星(池子法)
struct Bridge {
int u, v;
} bridge[MAXM]; //用来记录桥
int tot; //桥的个数
int fa[MAXN], cc; //fa:各个点所属的缩点(连通块),cc连通块的个数
int dfn[MAXN], low[MAXN], Time; //时间戳
int stack[MAXN], top; //用于维护连通块的
int n, m; //点的个数和边的条数
void connect(int u, int v, int w) {
nEdge++;
edge[nEdge].pre = pos[u];
edge[nEdge].v = v;
edge[nEdge].w = w;
pos[u] = nEdge;
}
vector graph[MAXN];
void tarjan(int cur, int from, int from_edge) {
low[cur] = dfn[cur] = Time++;
stack[++top] = cur;
for (int p=pos[cur]; p; p=edge[p].pre) {
int v = edge[p].v;
if (v == from&&abs(p-from_edge)<=1) continue; //注意一下这里
if (!dfn[v]) {
tarjan(v, cur, p);
if (low[v] < low[cur]) low[cur] = low[v];
if (low[v] > dfn[cur]) {
bridge[tot].u = cur;
bridge[tot++].v = v;
cc++;
graph[cc].clear();
do {
fa[stack[top]] = cc;
} while (stack[top--] != v);
}
} else if (low[cur] > dfn[v]) low[cur] = dfn[v];
}
}
int bfs(int x,int flag)
{
queue q;
int y;
q.push(x);
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
low[x]=0;
dfn[x]=1;
while(q.size()>0)
{
y=q.front();
// printf("%d\n",y);
q.pop();
for(int i=0;i
1008
Palindrome Sub-Array
求n*m的矩阵中的回文方阵,由于写了四个for,所以很担心会超时,所以加了l判断长度来压缩时间,最后竟然压到了100ms,一种很开心的感觉。
#include
#include
#include
#include
#include
#include
#include
#include
#include
1009
Warm up 2
本场最水的一道题,不多说了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include