无向图的最短环(需要输出路径)

参考代码:https://blog.csdn.net/yo_bc/article/details/75042688

POJ-1734

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAX = 100+9;
 5 const int _inf = 0x7fffffff;
 6 const int INF = _inf/3;//可能会出现三个inf相加
 7
 8 int n,m;
 9 int dis[MAX][MAX];
10 int map[MAX][MAX];
11 int pre[MAX][MAX],path[MAX];//用于打印路径
12
13 void init() {
14     for(int i = 1; i <= n; i++) {
15             for(int j = 1; j <= n; j++) {
16                 pre[i][j] = i;
17                 map[i][j] = dis[i][j] = INF;
18             }
19             map[i][i] = dis[i][i] = 0;
20         }
21 }
22
23 void folyd() {
24     int mins = INF;
25     int tmp;
26     int cnt ,sum;
27     for(int k = 1; k <= n; k++) {
28         for(int i = 1; i < k; i++) {
29             for(int j = i+1; j < k; j++) {
30                 tmp = dis[i][j] + map[i][k] + map[k][j];
31                 if(mins > tmp) {
32                     mins = tmp;
33                     cnt = 0, sum = 1;
34                     //cnt 用于更新路径path: 因为最短环在改变,所以路径也会变
35                     //sun 用于统计不同最小环的个数(i,j相同时可根据k区分,相同k可根据i,j区分,所以不会重???)
36                     int t = i;//注:这里的环是 j--k--i....j 所以前一个是 i
37                     while(t != j) {//递推找路径
38                         path[cnt++] = t;
39                         t = pre[j][t];
40                     }
41                     path[cnt++] = j;//t==j 时退出后,前一个是j
42                     path[cnt++] = k;//不是很懂这个耶.........
43                 }
44                 else if(mins == tmp) ++sum;//长度相同只是路径不同(虽然这题没用到)
45             }
46         }
47
48         for(int i = 1; i <= n; i++) {
49             for(int j = 1; j <= n; j++) {
50                 if(dis[i][j] > dis[i][k] + dis[k][j]) {
51                     dis[i][j] = dis[i][k] + dis[k][j];
52                     pre[i][j] = pre[k][j];//更新了最短路,pre自然要更新
53                 }
54
55             }
56         }
57     }
58
59     if(mins == INF ) puts("No solution.");
60     else {
61         for(int i = cnt-1; i > 0; --i) printf("%d ",path[i]);
62         printf("%d",path[0]);//格式要对哟
63     }
64 }
65
66 int main() {
67     while(~scanf("%d %d",&n,&m)) {
68         init();//初始化
69         int a,b,c;
70         for(int i = 1; i <= m; i++) {
71             scanf("%d%d%d",&a,&b,&c);
72             map[b][a] = map[a][b] = dis[b][a] = dis[a][b] = min(dis[a][b],c);
73         }
74         folyd();
75     }
76     return 0;
77 } 

原文地址:https://www.cnblogs.com/virtualtan/p/10778118.html

时间: 2024-10-17 20:22:50

无向图的最短环(需要输出路径)的相关文章

PTA 紧急救援 /// dijkstra 最短路数 输出路径

题目大意: 给定 n m s t :表示n个点编号为0~n-1 m条边 起点s终点t 接下来一行给定n个数:表示第i个点的救援队数量 接下来m行给定u v w:表示点u到点v有一条长度为w的边 求从s到t的最短路有几条 一条路上可以集合的救援队最多有多少 输出路径 #include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define inc(i,j,k) for(int

(Dijkstra 输出路径) HDU 1784 畅通工程续

Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0

Ignatius and the Princess I (hdu 1026 优先队列+bfs+输出路径)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14624    Accepted Submission(s): 4634 Special Judge Problem Description The Princess has been abducted by the BEelzeb

hdu 1026 Ignatius and the Princess I(bfs搜索+输出路径)

题目来源:hdu-1026 Ignatius and the Princess I Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14677 Accepted Submission(s): 4653 Special Judge Problem Description The Princ

poj(3984)——迷宫问题(输出路径)

题目的大致意思是:给你一个5*5的迷宫,然后你只能往上,下,左,右四个方向走,然后0代表的是可以走的路,1代表的是墙不可以走.然后让我们求出从左上角到右下角的最短路线及其长度. 求长度是好做的,但是输出路径这个我还是第一次碰到. 这里我们使用的队列不可以是STL中的queue了,要用数组来写,因为我们在这里需要头尾两个指针. 然后我们这里还要用到一个保存前驱节点的数组pre,这样在我们输出路径的时候就可以回溯上去. #include<stdio.h> #include<string.h&

MapReduce 编程 系列八 根据输入路径产生输出路径和清除HDFS目录

有了前面的MultipleOutputs的使用经验,就可以将HDFS输入目录的路径解析出来,组成输出路径,这在业务上是十分常用的.这样其实是没有多文件名输出,仅仅是调用了MultipleOutputs的addNamedOutput方法一次,设置文件名为result. 同时为了保证计算的可重入性,每次都需要将已经存在的输出目录删除. 先看pom.xml, 现在参数只有一个输入目录了,输出目录会在该路径后面自动加上/output. <project xmlns="http://maven.ap

vc下DLL项目设置dll和lib库输出路径以及使用lib/dll库时的包含路径

include 头文件包含路径设置: project->setting->C/C++->常规: Additional include directories(附加包含目录): ../../include等等 链接文件输出目录:    project->setting->配置属性->常规:输出目录 例如:输出目录:$(SolutionDir)Temp\Link\$(ProjectName)\$(ConfigurationName) 解释:项目目录-Temp-Link-工程

HD1385Minimum Transport Cost(Floyd + 输出路径)

Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9109    Accepted Submission(s): 2405 Problem Description These are N cities in Spring country. Between each pair of cities

poj3436 ACM Computer Factory, 最大流,输出路径

POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器,每个机器单位时间产量为Qi. 电脑由P个部件组成,每个机器工作时只能把有某些部件的半成品电脑(或什么都没有的空电脑)变成有另一些部件的半成品电脑或完整电脑(也可能移除某些部件).求电脑公司的单位时间最大产量,以及哪些机器有协作关系,即一台机器把它的产品交给哪些机器加工. Sample input 3 4 15  0 0 0  0 1 0 10  0 0 0  0 1 1 30  0 1 2  1 1 1 3