摘要: 题意:由n个牧场,编号1到n。每个牧场有一头牛。现在在牧场x举办party,每头牛都去参加,然后再回到自己的牧场。牧场之间会有一些单向的路。每头牛都会让自己往返的路程最短。问所有牛当中最长的往返路程是多少。思路:n最多到1000,floyd肯定超时。可以这样做,把图中所有的边先存起来,然后第一次用dijkstra求出以x为源点到每个点的最短距离。该最短距离为每头牛回家时的最短距离。然后建个新的图,将之前存的边反向加入图中。如之前有条从5到8距离为2的路,则此时向图中添加的边为从8到5距离为2的边。这样再次以x为源点求到每个点的最短距离,将两者相加,就是每头牛往返的最短距离了。求其中的最大值即可 阅读全文
posted @ 2013-08-07 18:01 fenshen371 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 题意:有a个村庄,编号为1到a,有b个城堡,编号为a+1到a+b。现在超级玛丽在a+b处,他的家在1处。每条路是双向的,两端地点的编号以及路的长度都已给出。路的长度和通过所需时间相等。他有一双鞋子,可以使用k次,每次使用后最多可以跑过l的距离,且通过这段距离所需时间为0。使用鞋子时,必须从村庄或城堡开始,到村庄或者城堡结束。但是,城堡充满了陷阱,他如果中途遇见城堡,就必须停下来,且鞋子视为使用完了一次。问超级玛丽回家所需的最短时间。思路:用floyd算法先处理出任意两点间的最短距离(不用鞋子时)。另用一个二维数组来维护两点之间是否允许用鞋子直接传送。当两点最短距离不大于l且中间不经过城堡时,数 阅读全文
posted @ 2013-08-07 17:42 fenshen371 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个字符串,求该串最多由多少个相同的子串相接而成。思路:只要做过poj 1961之后,这道题就很简单了。poj 1961 详细题解传送门。假设字符串的长度为len,如果 len % (len - next[len])不为0,说明该字符串不能由其他更短的字符串反复相接而成,结果输出1,否则答案为len / (len - next[len])。 1 #include 2 #include 3 #define maxn 1000010 4 char s[maxn]; 5 int next[maxn]; 6 void get_next(char str[]) 7 { 8 next[0]... 阅读全文
posted @ 2013-08-07 11:41 fenshen371 阅读(179) 评论(0) 推荐(0) 编辑