POJ
来源:互联网 发布:浙江省人口数据 编辑:程序博客网 时间:2024/06/07 06:06
题目大意:n 个点 m 条边,第二行开始每行三个数 表示 a 到 b 要花费 l 时间,所有奶牛要到 x 的位置去开 party,除了 x 外,别的奶牛去 x 都有一个来回的最短时间,求所有奶牛来回最短时间,并输出最大值
解题思路:有向图,所以来回时间是不同的,将临接矩阵行列对换,进行两次dijkstra即可
#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 1e3+5;using namespace std;int n, m, x;int map[MAXN][MAXN];int dis[MAXN], d[MAXN];bool vis[MAXN];int dijkstra() { for (int i = 1; i <= n; i++) { dis[i] = map[x][i]; d[i] = map[i][x]; } for (int i = 1; i <= n; i++) { int v, minn = INF; for (int j = 1; j <= n; j++) if (!vis[j] && dis[j] < minn) { minn = dis[j]; v = j; } vis[v] = true; for (int j = 1; j <= n; j++) if (!vis[j] && dis[j] > map[v][j] + dis[v]) dis[j] = map[v][j] + dis[v]; } memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { int v, minn = INF; for (int j = 1; j <= n; j++) if (!vis[j] && d[j] < minn) { minn = d[j]; v = j; } vis[v] = true; for (int j = 1; j <= n; j++) if (!vis[j] && d[j] > map[j][v] + d[v]) d[j] = map[j][v] + d[v]; } int maxx = -1; for (int i = 1; i <= n; i++) if (d[i] + dis[i] > maxx) maxx = d[i] + dis[i]; return maxx;}int main() { while (scanf("%d%d%d", &n, &m, &x) != EOF) { memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); for (int i = 0; i <= n; i++) for (int j = 0; j <= n; j++) if (i == j) map[i][j] = 0; else map[i][j] = INF; for (int i = 0; i < m; i++) { int a, b, l; scanf("%d%d%d", &a, &b, &l); map[a][b] = l; } printf("%d\n", dijkstra()); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- CentOS7yum安装mariadb及配置
- JQuery中$.ajax()方法参数详解
- JVM_2_HotStop虚拟机对象探秘
- Mac 系统下java端口占用
- 2017.9.17 相关分析 思考记录
- POJ
- Python类中实例方法、类方法及静态方法的调用区别
- POJ
- Mysql基础知识
- python常用语法
- Linux之lsof命令
- LRU最近最久未使用页面置换算法
- Vue学习之computed 与 method
- 第二十篇 jQuery 初步学习2