one from ural
2018-02-10 17:06
330 查看
#include <stdio.h> #include <stdlib.h> #include <vector> #include <iostream> #include <algorithm> #include <string.h> using namespace std; #define MAXN 102 #define INF 0x1e8 struct edge { int fromCity; int toCity; int length; struct edge(int u, int v, int w) { fromCity = u; toCity = v; length = w; } }; typedef struct edge Edge; typedef struct vertex { int pi; int weight; }Vertex; int edges[MAXN][MAXN]; int originalEdges[MAXN][MAXN]; int verticesPi[MAXN][MAXN]; Vertex vertices[MAXN]; vector<int > path; int M, N; void init() { memset(verticesPi, 0xff, sizeof(verticesPi)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) originalEdges[i][j] = (i == j) ? 0 : INF; } path.clear(); } void input() { int place1, place2, length; for (int i = 0; i < M; i++) { scanf("%d %d %d", &place1, &place2, &length); if (length < originalEdges[place1 - 1][place2 - 1]) { verticesPi[place1 - 1][place2 - 1] = place1 - 1; verticesPi[place2 - 1][place1 - 1] = place2 - 1; originalEdges[place1 - 1][place2 - 1] = originalEdges[place2 - 1][place1 - 1] = length; } } } void floydWarshall() { int minCircle = INF; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) edges[i][j] = originalEdges[i][j]; for (int k = 0; k < N; k++) { for (int i = 0; i < k; i++) { for (int j = i + 1; j < k; j++) { int D = edges[i][j] + originalEdges[i][k] + originalEdges[j][k]; if (D < minCircle) { minCircle = D; path.clear(); int t = j; path.push_back(j); while (verticesPi[i][t] != i) { path.push_back(verticesPi[i][t]); t = verticesPi[i][t]; } path.push_back(i); path.push_back(k); } } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (edges[i][j] > edges[i][k] + edges[k][j]) verticesPi[i][j] = verticesPi[k][j]; edges[i][j] = min(edges[i][j], edges[i][k] + edges[k][j]); } } } if (minCircle >= INF) printf("No solution.\n"); else for (int i = 0; i < path.size();i++) printf("%d%c", path[i] + 1, (i == path.size() - 1) ? '\n':' '); } int main() { while (scanf("%d", &N) && ~N) { scanf("%d", &M); init(); input(); floydWarshall(); } return 0; }
相关文章推荐
- URAL 1493. One Step from Happiness
- 一道题目- Find the smallest range that includes at least one number from each of the k lists
- Copying an image from one server to another using PHP
- IIS URL Rewrite redirect from one Domain to another
- Io 异常: Got minus one from a read call
- Thousands of TV and Radio Channels from One Small Box
- Transferring Data from One Table to Another
- Remove one mail item from all mailboxes Exchange 2010
- URAL 1495. One-two, One-two 2
- Passing data from one ABAP program to another
- How can we use transfer function to skip search page while going from one component to another?
- URAL 2014 Zhenya moves from parents
- This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workb
- One or more files from the Emulator for Windows CE installation is missing.Please reinstall Emulator for Windows CE and try agai
- 算法练习:URAL 1495 One-two, One-two 2
- error: dst ref refs/heads/zhCN_v0.13.1 receives from more than one src.
- [NPM] Pipe data from one npm script to another
- code fragment One from
- Insert Data From One Table to Another
- java.sql.SQLException: Io 异常: Got minus one from a read call