题目:http://poj.org/problem?id=1734

无向图求最小环,用floyd;

在每个k点更新f[i][j]之前,以k点作为直接连到i,j组成一个环的点,这样找一下最小环;

注意必须存直接相连的边,在找环时k点连到i,j的值不能是最短路。

调了一个小时发现把z打成y了......

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,f[][],pre[][],ans,path[],inf=1e9,top;
int sid[][];//真的有必要存直接相连的边
int main()
{
scanf("%d%d",&n,&m);
memset(f,-,sizeof f);
memset(sid,-,sizeof sid);
ans=inf;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(f[x][y]==-)//
{
f[x][y]=f[y][x]=z;
pre[x][y]=x;pre[y][x]=y;
sid[x][y]=z;sid[y][x]=z;
}
else
f[x][y]=f[y][x]=sid[x][y]=sid[y][x]=min(f[x][y],z);
}
for(int k=;k<=n;k++)
{
for(int i=;i<k;i++)//找环
for(int j=i+;j<k;j++)
{
// if(k==5)printf("i=%d j=%d ans=%d %d\n",i,j,ans,f[i][j]+sid[i][k]+sid[k][j]);
if(f[i][j]!=-&&sid[i][k]!=-&&sid[k][j]!=-&&ans>f[i][j]+sid[i][k]+sid[k][j])
{
ans=f[i][j]+sid[i][k]+sid[k][j];
// printf("sid[%d][%d]=%d\n",k,j,sid[k][j]);
// printf("ans=%d\n",ans);
// printf("!f[%d][%d]=%d f[%d][%d]=%d\n",i,k,f[i][k],k,j,f[k][j]);
top=;
int t=j;
while(t!=i)
{
path[++top]=t;
t=pre[i][t];
}
path[++top]=i;
path[++top]=k;//前提为k为单出一点
}
}
for(int i=;i<=n;i++)//
for(int j=;j<=n;j++)//
if(f[i][k]!=-&&f[k][j]!=-&&(f[i][j]>f[i][k]+f[k][j]||f[i][j]==-))//
{
// printf("f[%d][%d]=%d f[%d][%d]=%d\n",i,k,f[i][k],k,j,f[k][j]);
f[i][j]=f[i][k]+f[k][j];
pre[i][j]=pre[k][j];
} }
if(ans==inf)printf("No solution.");
else
{
for(int i=;i<=top;i++)
printf("%d ",path[i]);
}
return ;
}

poj1734Sightseeing trip——无向图求最小环的更多相关文章

  1. B. Shortest Cycle 无向图求最小环

    题意: 给定 n 个点,每个点有一个权值a[i],如果a[u]&a[v] != 0,那么就可以在(u,v)之间连一条边,求最后图的最小环(环由几个点构成) 题解:逻辑运算 & 是二进制 ...

  2. #10072. 「一本通 3.2 例 1」Sightseeing Trip(floyd求最小环+路径)

    https://loj.ac/problem/10072 针对无向图 因为Floyd是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点k,当前的点k肯定不存在于已存在的最短路f[i ...

  3. POJ1734无向图求最小环

    题目:http://poj.org/problem?id=1734 方法有点像floyd.若与k直接相连的 i 和 j 在不经过k的情况下已经连通,则有环. 注意区分直接连接和间接连接. * 路径记录 ...

  4. 【POJ1734】Sightseeing Trip 无向图最小环

    题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...

  5. POJ 1734 Sightseeing trip(无向图最小环+输出路径)

    题目链接 #include <cstdio> #include <string> #include <cstring> #include <queue> ...

  6. POJ1734 Sightseeing trip (Floyd求最小环)

    学习了一下用Floyd求最小环,思路还是比较清晰的. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring ...

  7. FLOYD 求最小环

    首先 先介绍一下 FLOYD算法的基本思想   设d[i,j,k]是在只允许经过结点1…k的情况下i到j的最短路长度则它有两种情况(想一想,为什么):最短路经过点k,d[i,j,k]=d[i,k,k- ...

  8. hdu 1599 find the mincost route(无向图的最小环)

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. 2021.11.03 P6175 无向图的最小环问题

    2021.11.03 P6175 无向图的最小环问题 P6175 无向图的最小环问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给定一张无向图,求图中一个至少包含 33 ...

随机推荐

  1. python中strip()函数的理解

    1.strip()函数 函数原型 声明:s为字符串.rm为要删除的字符序列 s.strip(rm) :删除s字符串中开头.结尾处.位于 rm删除序列的字符 s.lstrip(rm) :删除s字符串中开 ...

  2. FreeRTOS在神舟IV号开发板的应用demo

    下面一个可以直接编译运行的例子,FreeRTOS的版本是V7.1.0,芯片是STM32F107VCT6,使用的开发环境是Keil uVision5. 这里例子创建了四个任务,每个任务控制一个LED的亮 ...

  3. onscreen and offscreen

    本文来自stackoverflow一位网友的解答,感觉非常不错就摘录了. --------------------------------------------------------------- ...

  4. JS常用方法手记

    1.判断arr数组是否含有元素str,没有返回-1 arr.indexOf(str) 2.遍历arr数组,k为键,v为值 arr.map((v, k) => { return;}) 3.arr数 ...

  5. java项目中的classpath到底是什么

    https://segmentfault.com/a/1190000015802324

  6. Swift 学习笔记(面向协议编程)

    在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ...

  7. Android进程的生命周期

    Android系统想要永久的保留一个应用进程差点儿是不可能的.所以系统就须要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来执行新的或者更重要的进程,那么系统怎样决定哪个进程应该保留哪个应该杀 ...

  8. ABAP 数值转换大写

    转自:http://www.dasunny.com/wordpress/sapnotes/2015113091.htmlSAP标准的数值转换函数 SPELL_AMOUNT, 仅对整数部分进行了处理,小 ...

  9. sourceSet

    android { sourceSets { main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources ...

  10. redis下载及安装服务

    1 . 要安装Redis,首先要获取安装包. Windows的Redis安装包需要到以下GitHub链接找到. 链接:https://github.com/MSOpenTech/redis 打开网站后 ...