摘要: 该题反过来想:将所有可能发生恋爱关系的男女配对,那么可以带出去的人数应该等于这个二分图的最大独立集 先要做一下预处理,把不符合要求的双方先求出来, company[i][j]表示i、j四个标准都不符合,即他们可能会成为伴侣。这里要注意因为x、y集合都是0~n-1,左右对称,所以求最大点独立集的点的个数时,最后还要/2。接下来就是求最大独立集的点的个数。最大点独立集+最小点覆盖=点的个数 独立集:在集合中的任意两点都不相邻,即两点间不存在边#include #include #include #include using namespace std;const int maxnx=510;con 阅读全文
posted @ 2013-08-25 17:07 辰曦~文若 阅读(307) 评论(0) 推荐(0)
摘要: 题意:有R条路,每条路都有一定的路长和花费,问在总的花费小于一定的值的情况下,从1到N的最短路程 注意:这里两点之间单向边,且可能存在很多条路,所以只能用邻接表存储。思路:用dijkstra,但是每次判断一个元素是否能进入队列,并不是源点到它的距离被更新了才入队, 而是只要满足从源点到该点总的路费小于给定的值,都可入队。 每次从优先级队列中取出路程最小(如果路程相同,取花费最小)的点。 当N点被取出来时,直接结束#include #include #include #include #include #include #include using namespace std;const ... 阅读全文
posted @ 2013-08-25 13:12 辰曦~文若 阅读(205) 评论(0) 推荐(0)
摘要: 题意:现在已有m条单向路,问在给你的k条双向路中选择一条,使得s到t的距离最短思路:设双向路两端点为a,b;长度为c。 s到t的有三种情况: 1:原本s到t的路径 2:从s到a,a到b,b再到t的路径 3:从s到b,b到a,a再到t的路径 s到t的最短路径即三者之间的最小值,枚举每个双向路,取其中的最小值即可。 用两次dijkstra,第一次求s到其它点的距离(正向图),第二次求t到其它点的距离(反向图) 因为实际上我们要求的是其它点到t的距离,所以在第二次用dijkstra时,是在原先图的反向图基础上,求t到其它点的距离。#include #include #in... 阅读全文
posted @ 2013-08-25 12:47 辰曦~文若 阅读(327) 评论(0) 推荐(0)
摘要: 题意:每个城市举办庆祝有一定的花费,A在路径上会选择庆祝花费最大的城市 让你求,A回家所花的路费和庆祝费最少,也就是说并不是最短路径就是结果, 还有可能就是路费比最短路径的多,但是庆祝费就比它的少,总的加起来可能更小。思路:枚举每个城市作为庆祝的点,设为x。以x为源点,用dijks求单源路径,路径上如果有大于x庆祝费的点,则不考虑进去。 求完所有点到x的单源路径后,用两重j、k的for循环,同步更新从j到k所需要的最小花费#include #include #include #include #include #include #include #include using... 阅读全文
posted @ 2013-08-25 11:10 辰曦~文若 阅读(348) 评论(0) 推荐(0)
摘要: 用map建立从货币名称到序号的映射,看做节点,汇率则看做边权,是单向路。用floyd,只不过这里把加号变成乘号,而且是两点间的最大值。 最后求是否有这么一点,从该点出发,再回到该点,总的值大于1。注意: 不能使用dijaskra,因为增值的方法不一定是优先选择权值最大的路径,有可能是一开始的汇率小,但之后就大,总的乘积大于1. 所以要用以动态规划为基本思想的floyd来做。#include #include #include #include #include #include #include #include using namespace std;map currency; //建... 阅读全文
posted @ 2013-08-25 10:26 辰曦~文若 阅读(257) 评论(0) 推荐(0)
摘要: 求最短路,以草儿所在的地方设为0,当做源点,草儿临近的城市到草儿的距离设为0这里有一点要注意:并不是1~N的城市都出会出现,所以我用city数组来存储出现过的城市编号,如city[i]=1表示 i 出现在数据里,这样就减少不必要的遍历。#include #include #include #include #include #include #include using namespace std;const int maxn=0x3f3f3f3f;int road[1010][1010];//road[i][j]表示i与j的距离(这里指进过该条路的时间)int dis[1010];//dis 阅读全文
posted @ 2013-08-25 10:08 辰曦~文若 阅读(140) 评论(0) 推荐(0)
摘要: 求1到N的最短路径,模板题,以1为源点,用dijkstra算法(可以用优先级队列优化)#include #include #include #include #include #include #include using namespace std;const int maxn=0x3f3f3f3f;int road[110][110];//road[i][j]表示i与j的距离(这里指进过该条路的时间)int dis[110];//dis[i]表示i点到源点1的最短路径大小int vis[110];//vis[i]=1表示节点i已经求过到源点的单源最短路径vector link[110];/ 阅读全文
posted @ 2013-08-25 09:53 辰曦~文若 阅读(284) 评论(0) 推荐(0)