您的位置:首页 > 其它

NOI 2009 变换序列

2011-08-02 20:24 176 查看
二分图倒序做就可以

#include <cstdio>
#include <cstring>
const int MAXN = 10000 + 1234;
const int MAXM = 20000 + 1234;
bool used[MAXN];
int links[MAXN];
int vis[MAXN];
int map[MAXN][3];
int cnt;
int n;
bool find(int t)
{
for(int i = 1; i <= map[t][0]; i++)
{
int v = map[t][i];
if(used[v] == 0)
{
used[v] = 1;
if(links[v] == -1 || find(links[v]))
{
links[v] = t;
vis[t] = v;
return true;
}
}
}
return false;
}
void MaxMatch()
{
memset(links, -1, sizeof(links));
for(int i = n; i >= 1; i--)
{
memset(used, 0, sizeof(used));
if(!find(i))
{
printf("No Answer\n");
return;
}
}
for(int i = 1; i <= n - 1; i++) printf("%d ", vis[i] - 1);
printf("%d\n", vis
- 1);
}
void adjust()
{
for(int i = 1; i <= n; i++)//使map[i][2] > map[i][1]
{
if(map[i][0] == 2)
{
if(map[i][1] > map[i][2])
{
int temp = map[i][1];
map[i][1] = map[i][2];
map[i][2] = temp;
}
}
}
}
int main()
{
while(scanf("%d", &n) != EOF)
{
int a, b, x;
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
a = (i + x) % n;
if(a == 0) a = n;
b = (i - x + n) % n;
if(b == 0) b = n;
if(a != b)
{
map[i][0] = 2;
map[i][1] = a;
map[i][2] = b;
}
else
{
map[i][0] = 1;
map[i][1] = a;
}
}
adjust();
//for(int i = 1; i <= n; i++) printf("%d %d\n",map[i][1], map[i][2]);
MaxMatch();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: