POJ3268之最短路
来源:互联网 发布:网络黄金合法吗 编辑:程序博客网 时间:2024/05/18 18:42
#include <iostream> #define INF 0x1f1f1f1f #define MAX_SIZE 1005 using namespace std; int map[MAX_SIZE][MAX_SIZE]; int dis[MAX_SIZE]; bool mark[MAX_SIZE]; void init(int n) { for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) map[i][j] = INF; map[i][i] = 0; } } void dijkstar(int start, int n) { for(int i = 1; i <= n; ++i) { dis[i] = map[start][i]; mark[i] = false; } dis[start] = 0; mark[start] = true; int mindis, tag; while(1) { mindis = INF; for(int i = 1; i <= n; ++i) { if(!mark[i] && mindis > dis[i]) { mindis = dis[i]; tag = i; } } mark[tag] = true; if(mindis == INF) break; for(int i = 1; i <= n; ++i) { if(!mark[i] && dis[i] > dis[tag] + map[tag][i]) dis[i] = dis[tag] + map[tag][i]; } } } int main() { ///需要看看以前的代码,所以还是不够熟,加油!! int n, m, end; while(cin >> n >> m >> end) { init(n); int x, y, w; while(m--) { cin >> x >> y >> w; if(map[x][y] > w) map[x][y] = w; } int sum2[MAX_SIZE]; dijkstar(end, n); for(int i = 1; i <= n; ++i) { sum2[i] = dis[i]; } int temp; for(int i = 1; i <= n; ++i) { for(int j = i + 1; j <= n; ++j) { temp = map[i][j]; map[i][j] = map[j][i]; map[j][i] = temp; } } int sum1[MAX_SIZE]; dijkstar(end, n); for(int i = 1; i <= n; ++i) { sum1[i] = dis[i]; } int max = -1; for(int i = 1; i <= n ; ++i) { max = (max > sum1[i] + sum2[i]) ? max : sum1[i] + sum2[i]; } cout << max << endl; } return 0; }
今天把以前有用的东西整理一下
这个是自己第一次写的,比较好理解,但优化不够
#include <iostream> #define INF 0x1f1f1f1f #define N 1005 using namespace std; int map1[N][N], map2[N][N];//建两个图,一个是另一个的转置 int dis1[N], dis2[N]; bool mark1[N], mark2[N]; int n, m, x; void init() { int i, j; for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { map1[i][j] = INF; map2[i][j] = INF; } map1[i][i] = 0; map2[i][i] = 0; } } void dijFirst(int start, int n) { int i, j, mindis, k; for(i = 1; i <= n; ++i) { dis1[i] = map1[start][i]; mark1[i] = false; } dis1[start] = 0; mark1[start] = true; while(1) { mindis = INF; for(j = 1; j <= n; ++j) { if(!mark1[j] && mindis > dis1[j]) { mindis = dis1[j]; k = j; } } mark1[k] = true; if(mindis == INF) break; for(j = 1; j <= n; ++j) { if(!mark1[j] && dis1[j] > dis1[k] + map1[k][j]) dis1[j] = dis1[k] + map1[k][j]; } } } void dijSecond(int start, int n) { int i, j, mindis, k; for(i = 1; i <= n; ++i) { dis2[i] = map2[start][i]; mark2[i] = false; } dis2[start] = 0; mark2[start] = true; while(1) { mindis = INF; for(j = 1; j <= n; ++j) { if(!mark2[j] && mindis > dis2[j]) { mindis = dis2[j]; k = j; } } mark2[k] = true; if(mindis == INF) break; for(j = 1; j <= n; ++j) { if(!mark2[j] && dis2[j] > dis2[k] + map2[k][j]) dis2[j] = dis2[k] + map2[k][j]; } } } int main() { int i, j; while(cin >> n >> m >> x) { init(); for(i = 1; i <= m; ++i) { int u, v ,w; cin >> u >> v >> w; map2[u][v] = w; } int max; max = 0; dijSecond(x, n); ///最关键的地方,将矩阵转置以后,从终节点出发到其他节点的距离,就是反向走有向图 for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { map1[i][j] = map2[j][i]; } } dijFirst(x, n); for(i = 1; i <= n; ++i) { max = (dis1[i] + dis2[i] > max) ? (dis1[i] + dis2[i]) : max; } cout << max << endl; } //cout << "Hello world!" << endl; return 0; }
0 0
- POJ3268之最短路
- poj3268最短路Dijkstrra
- 最短路 dijkstra---poj3268
- poj3268 最短路
- POJ3268【最短路】
- POJ3268 最短路
- POJ3268最短路水题
- poj3268(最短路,dijkstra)
- 基础最短路四 POJ3268
- POJ3268 Silver Cow Party DIJ最短路
- POJ3268 Silver Cow Party 最短路
- 【POJ3268】Silver Cow Party 最短路
- poj3268 Silver Cow Party(最短路变形)
- POJ3268 Silver Cow Party(最短路问题)
- poj3268 Silver Cow Party【最短路】
- poj3268——Silver Cow Party(最短路+godv之力)
- 最短路(SPFA+负权回路的判断)-poj3268
- POJ3268—Silver Cow Party(反向最短路)
- mantis bug tracker
- 新浪微博做电商为他人嫁衣迷失自己
- web.xml文件介绍
- LoadRunner设置检查点的方法有哪些
- Hibernate状态 (merge,attachDirty,attachClean)
- POJ3268之最短路
- C++ 模拟浏览器发送HTTP请求
- 求安卓九宫格密码的全部组合 深度优先遍历算法
- SyntaxError: Non-ASCII character
- SpringMVC + Kindeditor时List items = upload.parseRequest(request);为空
- swift UIButton使用
- JSON资料整理
- 数据挖掘 决策树算法 ID3 通俗演绎
- 两种方式创建单利