| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
双栈排序的二分图算法是可以过的,我就过了In Reply To:雁过留声——虎年,一起dfs Posted by:fanhqme at 2010-02-16 21:50:13 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 250
struct Edge
{
int v, next;
} edge[maxn * maxn];
int n;
int stock[maxn], f[maxn];
int head[maxn], ecount, color[maxn], q[maxn];
int out[maxn];
bool ok;
int stk1[maxn], stk2[maxn];
int top1, top2, step;
void input()
{
for (int i = 0; i < n; i++)
{
scanf("%d", &stock[i]);
out[i] = stock[i];
}
}
void addedge(int &a, int &b)
{
edge[ecount].next = head[a];
edge[ecount].v = b;
head[a] = ecount++;
}
void bfs(int &s)
{
int front = 0;
int rear = 1;
q[0] = s;
color[s] = 1;
while (front != rear)
{
int a = q[front++];
for (int i = head[a]; i != -1; i = edge[i].next)
{
int b = edge[i].v;
if (!color[b])
{
q[rear++] = b;
color[b] = 3 - color[a];
}
else if (color[a] == color[b])
{
ok = false;
return;
}
}
}
}
void make(int i)
{
int a = stock[i];
bool did = true;
while (did)
{
did = false;
if (top1 > 0 && stk1[top1 - 1] == out[step])
{
top1--;
printf("pop 1\n");
step++;
did = true;
}
if (top2 > 0 && stk2[top2 - 1] == out[step])
{
top2--;
printf("pop 2\n");
step++;
did = true;
}
}
if (i < 0)
return;
if (color[i] == 1)
{
stk1[top1++] = a;
printf("push 1\n");
}
else
{
stk2[top2++] = a;
printf("push 2\n");
}
}
void print()
{
top1 = top2 = 0;
step = 0;
for (int i = n - 1; i >= 0; i--)
make(i);
make(-1);
}
void work()
{
memset(head, -1, sizeof(head));
f[0] = stock[0];
for (int i = 1; i < n; i++)
f[i] = min(f[i - 1], stock[i]);
ecount = 0;
for (int i = 1; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (stock[j] >= stock[i])
continue;
if (stock[j] > f[i - 1])
{
addedge(i, j);
addedge(j, i);
}
}
}
ok = true;
memset(color, 0, sizeof(color));
for (int i = 0; i < n; i++)
{
if (!color[i])
bfs(i);
if (!ok)
{
printf("impossible\n");
return;
}
}
print();
}
int main()
{
//freopen("t.txt", "r", stdin);
int t = 0;
while (scanf("%d", &n), n)
{
t++;
printf("#%d\n", t);
input();
sort(out, out + n);
work();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator