Graph Discovery [交互题]没弄好

题目描述:

Bessie 准备了一个难题给Farmer Johm。在他面前是一个有N个岛屿的湖泊,岛屿之间有桥。 Bessie会告诉FJ如果不用一个桥的集合,是否可以从任意岛屿走到任意岛屿。 也就是说,我们考虑一张图。Bessie告诉FJ如果拿走一个边集,N个点是否还是连通的?(保证初始的图是连通的。) FJ想要知道哪些桥是存在的。你要用尽可能少的询问帮助FJ搞清楚这个问题。 下面是一个例子:

1--2
|\ |
| \|
4  3

FJ 的询问        |  Bessie 的回答        |  
------------------------------------------------------------------------
{{1,2}}         |     Yes              |
{{3,4}}         |     Yes              |
{{1,4}, {4,3}}  |     No               | {1,4} 肯定是边
{{1,2}, {2,3}}  |     No               | {2,3} 肯定是边
{{1,2}, {3,1}}  |     No               | {1,3} 肯定是边
{{1,3}}         |     Yes              | {1,2} 肯定是边
{{1,4}}         |     No               | {2,4} 和 {3,4} 肯定不是边

FJ就可以搞明白,原图的边集是 {{1,2}, {1,3}, {1,4}, {2,3}}。
这个问题是一个交互题,也就是说,你不使用读入和写入文件,而是采用stdin和stdout来和一个程序交互。详见下面的输入和输出细节:
最开始,评分程序会写入N(图的点数)。然后你需要写入下面三种格式的内容:
R i j
U i j
Q
R U Q代表着字符'R','U','Q',i和j在1到N之间。
第一种'R'意味着移除边(i,j)(如果存在)。
第二种'U'意味着添加之前被删除的边(i,j)。
第三种'Q'询问原图是否还连通。评分程序会返回0(不连通)或者1(连通)。
当你的程序准备输出原图,你应该单独输出一行,只包含一个'A'。然后是N行,每行包含N个字符。
第i行的第j个字符如果是1,代表着原图存在(i,j)这条边;否则是0,代表不存在。
如果你输出的图是不正确的,你获得0分。否则,你获得的分基于你'Q'的次数。
如果你输出的'Q'不超过900次,你可以获得100%的分数。
如果你输出的'Q'多于900次,不超过5000次(假设是x次),你可以获得20%+80%*(900/x)的分数。
如果你输出的'Q'多于5000次,你可以获得0%的分数。
下面是一个输入输出的例子(<表示评分程序的输出,>代表你的程序的输出):
I/O | 删除边的集合
----------------------------------
< 4        |
> R 1 2    | {{1,2}}
> Q        |
< 1        |
> U 1 2    | {}
> R 3 4    | {{3,4}}
> Q        |
< 1        |
> R 4 1    | {{3,4}, {4,1}}
> Q        |
< 0        |
> U 3 4    | {{4,1}}
> U 1 4    | {}
> R 1 2    | {{1,2}}
> R 2 3    | {{1,2}, {2,3}}
> Q        |
< 0        |
> U 3 2    | {{1,2}}
> R 3 1    | {{1,2}, {3,1}}
> Q        |
< 0        |
> U 1 2    | {{3,1}}
> Q        |
< 1        |
> U 3 1    | {}
> R 1 4    | {{1,4}}
> Q        |
< 0        |
> A        |
> 0111     |
> 1010     |
> 1100     |
> 1000     |
时间限制: 2000ms
空间限制: 128MB

来源: Usaco2011 Mar Gold