TopCoder SRM 447 DIV2 九月 7th, 2009

FaceBook赞助的一次比赛,差点拿到奖金- -|||,本来是ROOM LEADER的,结果1000想当然了一个地方,挂了= =,ROOM里面原来排第三的人好高兴啊……

题解:

TopCoder SRM 447 DIV2 EASY 250p:两个排序(甚至不排序也行),水

TopCoder SRM 447 DIV2 MIDDLE 500p:超级简单的模拟题,水

TopCoder SRM 447 DIV2 HARD 900p:图论题,我一如既往的想繁了,我的算法如下:

现根据依赖关系构建有向图,同时计算入度和出度

每次选一个出度为0的点,然后把它加入指向它的点中入度最大的点的import list,然后删去该点,重复运行直到点全部删去。

这其实有点贪心的意思,不过可以证明正确

然后是我的悲剧:写删点的时候写了个递归,然后没写判重(估计了一下必定会结束就没写= =,我太弱了。。。),但是我没注意不判重的话复杂度增长是指数级的……于是所有数据里面TLE了一个点,奖金就此88了……

比较简单的算法如下(其中ga为邻接矩阵):

for i=1 to n

for j=1 to n

for k=1 to n

if(ga[i][k]&&ga[k][j])ga[i][j]=false;

呵呵,有点floyed的意思,不过k是在最内层的(你要标准点写最外层也无所谓╮(╯_╰)╭),可以这样写的原因是题目保证若有ga[i][k]=true,ga[k][j]=true,则必有ga[i][j]=true(这也是上面那个贪心正确的原因)。其实也就是说如果可以用import的点import另一个的,另一个就不要在这个点import了。

 

Relate Posts:

Leave a Reply

7+6