ACM-最短路径 MST
文章平均质量分 67
czhou0
这个作者很懒,什么都没留下…
展开
-
POJ 1062 昂贵的聘礼(最短路径.Dijkstra)
因为有等级限制,关键是要枚举所有可能的情况。例如 M = 2, 酋长的等级是 4,那么所有能参与交易的人的等级要么是 2 ~ 4, 要么是 3 ~ 5, 要么是 4 ~ 6。只要把不能参加交易的人排除,算出最短路径即可。然后取各种情况中的最小值输出。 所以核心算法还是 Dijkstra。 #include #include #include #define FOR(i, N) for(in原创 2012-07-27 00:00:24 · 479 阅读 · 0 评论 -
POJ 1860 Currency Exchange (最短路径.Bellman-Ford)
用到的是 Bellman-Ford 算法。有些不同的是标准的 Bellman-Ford 是求最短路径的,而这道题有求最大路径的意思。需要判断的是是否有回路,这里也跟标准的判断是否有负权回路有所不同,这里判断的是是否有“正权回路”。 具体实现方法是,只要将原本算法中的大于号小于号全部反转即可。交的时候自己心里也没底,后来竟然一次过了~ #include #include #define FO原创 2012-07-26 23:51:25 · 565 阅读 · 0 评论 -
POJ 1789 Truck History (MST.Prim)
感觉还是理解题目比较难一些。。 算法还是Prim,没有特别 的变化。之前都按自己的理解写的Prim,这次看了算法导论中的伪代码,原来Prim还有更快速的实现方法。这个方法把与树的距离用一个域储存了一起,这样就不用每次都查找与树相邻的边了。 #include #include #include #include #include #include #define FOR(i, N) for(原创 2012-07-28 22:51:31 · 229 阅读 · 0 评论 -
POJ 1125 Stockbroker Grapevine (最短路径.Floyd-Warshall)
将这N个点依次作为源点,求最短路径,只要把这些最短路径中的最小值输出。 Floyd-Warshall算法其实就是用到了DP。求 i 到 j 的最短路径,k 为中间点编号的最大值,i 到 j 的最短路径要么包括 k, 要么不包括 k。 #include #include #include #define FOR(i, N) for(int i = 1; i <= (N); i++) usin原创 2012-07-27 23:48:49 · 251 阅读 · 0 评论 -
POJ 2253 Frogger (最小生成树.Prim)
从点 1 开始生成最小生成树,直到将点 2 加入到树中,返回树中最大的边即可。 基本算法是Prim。 #include #include #include #define FOR(i, N) for(int i = 1; i <= (N); i++) using namespace std; double cost[500][500]; int coordinate[500][2];原创 2012-07-27 23:04:36 · 299 阅读 · 0 评论 -
POJ 3295 Wormholes (ShortestPath.Bellman-Ford)
你妹啊,终于过了。 题目的意思是要判断一个图中是否有负权回路,由于太菜,最先想到的是 Floyd-Warshall 算法,求出每个点到每个点的最短距离。毫无疑问TLE了。 发现应该用 Bellman-Ford 之后,最先以为把每个点作为源点,然后才能判断是否有负权回路,还是 TLE。 其实只要把其中某个点作为源点,就能判断是否有负权回路。 Bellman-Ford 的步骤: (1)循原创 2012-07-25 23:58:51 · 232 阅读 · 0 评论 -
POJ 2485 Highways (MST.Prim)
赤裸裸的MST问题。 #include #include #define FOR(i, n) for(int i = 0; i < (n); i++) using namespace std; int cost[500][500]; bool inTree[500]; void init(int N){ FOR(i, N) FOR(j, N) scanf("%d", &cos原创 2012-07-24 22:07:08 · 254 阅读 · 0 评论 -
POJ 1258 Agri-Net (Prim)
一个小镇,要给所有的农田的通电,每对农田间的距离不同,问怎样铺设电线使电线的总长度最少。 最小生成树问题,所以用 Prim 算法,跟之前一篇有点像。 #include using namespace std; int f[101]; int cost[101][101]; bool inSet[101]; int main(){ int n; while(cin >> n){原创 2012-07-10 23:28:22 · 205 阅读 · 0 评论 -
POJ2560 Prim
问题: 存在n个点,已知这些点的坐标,求出这些点的最小生成树(minimal spanning tree)的权重。 算法: Prim:1.任选一个点,加入树中,作为第一个树中的点。 2.取距离现有树距离最小的点,加入树中。 3.重复步骤2, 直至所有点都加入到树中。 注意点:1.已处理点与未处理点的表示与转换。 代码: #includ原创 2012-07-04 22:11:50 · 221 阅读 · 0 评论