POJ 1734.Sightseeing trip 解题报告

Floyd 最小环模板题

code

/*
       floyd最小环,记录路径,时间复杂度O(n^3)
       不能处理负环
*/
#include <iostream>
#include <cstring>
using namespace std;
const int INF = 109, maxn = 252645135;
int g[INF][INF], dis[INF][INF], pre[INF][INF];
int ans[INF];
//pr[i][j]记录i到j最短路径的第一个点
int n, m, tem , tol;
int main() {
	while (cin >> n >> m) {
		tem = maxn;
		memset (g, 0xf, sizeof g);
		memset (dis, 0xf, sizeof dis);
		memset (pre, 0, sizeof pre);
		int x, y, z;
		for (int i = 1; i <= m; i++) {
			cin >> x >> y >> z;
			if (z < g[x][y])
				dis[x][y] = dis[y][x] = g[x][y] = g[y][x] = z;
			pre[x][y] = y, pre[y][x] = x;
		}
		for (int k = 1; k <= n; k++) {
			for (int i = 1; i < k; i++)
				for (int j = i + 1; j < k; j++) {
					if (tem > dis[i][j] + g[i][k] + g[k][j]) {
						tem = dis[i][j] + g[i][k] + g[k][j];
						int t = i;
						tol = 0;
						while (t != 0) {
							ans[++tol] = t;
							t = pre[t][j];
						}
						ans[++tol] = k;
					}
				}
			for (int i = 1; i <= n; i++)
				for (int j = 1; j <= n; j++)
					if (i != j && dis[i][k] + dis[k][j] < dis[i][j]) {
						dis[i][j] = dis[i][k] + dis[k][j];
						pre[i][j] = pre[i][k];
					}
		}
		if (tem == maxn) cout << "No solution.";
		else
			for (int i = 1; i <= tol; i++)
				cout << ans[i] << ‘ ‘;
		cout << endl;
	}
	return 0;
}

  

时间: 2024-10-13 23:06:48

POJ 1734.Sightseeing trip 解题报告的相关文章

POJ 1734 Sightseeing trip (Floyd 最小环+记录路径)

Sightseeing trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5040   Accepted: 1932   Special Judge Description There is a travel agency in Adelton town on Zanzibar island. It has decided to offer its clients, besides many other attra

poj 1734 Sightseeing trip判断最短长度的环

Sightseeing trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5590   Accepted: 2151   Special Judge Description There is a travel agency in Adelton town on Zanzibar island. It has decided to offer its clients, besides many other attra

POJ 1734 Sightseeing trip

题目大意: 求一个最小环. 用Floyd 求最小环算法. #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <cstring> using namespace std; #define

poj 3020 Antenna Placement 解题报告

题目链接:http://poj.org/problem?id=3020 题目意思:首先,请忽略那幅有可能误导他人成分的截图(可能我悟性差,反正有一点点误导我了). 给出一幅 h * w 的图,  “ * ” 表示 point of interest,“ o ” 忽略之.你可以对 " * " (假设这个 “* ”的坐标是 (i, j))画圈,每个圈只能把它四周的某一个点括住(或者是上面(i-1, j) or 下面(i+1, j) or 左边(i, j-1)  or 右边(i, j+1))

poj 1789 Truck History 解题报告

题目链接:http://poj.org/problem?id=1789 题目意思:给出 N 行,每行7个字符你,统计所有的 行 与 行 之间的差值(就是相同位置下字母不相同),一个位置不相同就为1,依次累加.问最终的差值最少是多少. 额.....题意我是没看懂啦= =......看懂之后,就转化为最小生成树来做了.这是一个完全图,即每条边与除它之外的所有边都连通.边与边的权值是通过这个差值来算出来的. 1 #include <iostream> 2 #include <cstdio>

poj 1860 Currency Exchange 解题报告

题目链接:http://poj.org/problem?id=1860 题目意思:给出 N 种 currency, M种兑换方式,Nick 拥有的的currency 编号S 以及他的具体的currency(V).M 种兑换方式中每种用6个数描述: A, B, Rab, Cab, Rba, Cba.其中,Rab: 货币A 兑换 货币B 的汇率为Rab,佣金为Cab.Rba:货币B 兑换 货币 A 的汇率,佣金为Cba.假设含有的A货币是x,那么如果兑换成B,得到的货币B 就是:(x-Cab) *

poj 2531 Network Saboteur 解题报告

题目链接:http://poj.org/problem?id=2531 题目意思:将 n 个点分成两个部分A和B(也就是两个子集啦), 使得子集和最大(一定很难理解吧,呵呵).举个例子吧,对于样例,最佳的分法就是把点2分为一个子集,另一个子集理所当然就是1.3了. 2-1 的权值是50,2-3的权值是40,那么最大就是50+40 = 90了. 首先dfs的话,我不太会做啦.看了队长的用了状态压缩来做,一下子觉得好神奇!!!! 可能第一次接触,理解得不是太深刻,先留着吧.就觉得好神奇,好神奇...

poj 3368 Frequent values 解题报告

题目链接:http://poj.org/problem?id=3368 题目意思:给出一段 n 个数的序列你,对于区间 [l, r] 的询问,找出 出现频率最高的数的次数.考虑到序列中的数是非递减的,也就是相同的数会连续不间断地在一起,于是就才有了代码中这个部分来预判了: if (s > t)        printf("%d\n", ans); 这个人写RMQ 写得不错:http://dongxicheng.org/structure/lca-rmq/ 这题就是套模板的,纪念

poj 1325 Machine Schedule 解题报告

题目链接:http://poj.org/problem?id=1325 题目意思:有 k 个作业,机器A有 n 个模式:0 ~ n-1,机器B 有 m 个模式:0~ m-1.每一个作业能运行在 A 的 某一个模式(假设为 i (0 <= i <= n-1 ) )或 B 的某一个模式下(j (0 <= j <= m-1)).多个作业可以同时运行在 A 的某一个 模式下,当然 B 也如此.每对A 或 B 转换一次模式,就要重启一次 A 或者 B,你需要选择A 或 B 的一些模式,使得所