poj 1734 Floyd算求有向图的最小环
来源:互联网 发布:手机怎样淘宝购物 编辑:程序博客网 时间:2024/05/18 18:43
题意:旅游公司要开发一条新的路线 , 要求这是一个总路程尽可能短的环 , 并且不能只含两个城市 , 除开起点外 ,不能重复走之前走过的城市 , 输出这条路线?
Floyd算法求最小环
代码:
//用floyd算法 , 求有向图的最小环
#include
#include
#include
#include
using namespace std;
#define INF 0xfffffff
#define maxn 110
int grap[maxn][maxn] , n , m;
int dist[maxn][maxn];
int past[maxn][maxn];
int mincircle;
int path[maxn] , k1 ;
void init()
{
int i ,j;
for(i = 1; i<= n; i++)
for(j = 1; j<= n; j++)
grap[i][j] =INF;
}
void floyd()
{
mincircle =INF;
int i ,j;
for(i = 1; i<= n; i++)
for(j = 1; j<= n; j++)
{
dist[i][j] =grap[i][j];
past[i][j] =i;
}
for(int k =1; k <= n; k++) //每个点都成为一次中间点 ,和bellman-ford不一样
{
for(i = 1; i<= n; i++) //判断是不是最小环
for(j = 1; j<= n; j++)
{
if(i ==j) continue;
if(dist[i][j] != INF &&grap[j][k]!=INF&&grap[k][i]!=INF && mincircle >dist[i][j]+grap[j][k]+grap[k][i])
{
mincircle =dist[i][j]+grap[j][k]+grap[k][i];
k1 =0;
path[k1++] =i;
path[k1++] =k;
path[k1++] =j;
while(past[i][path[k1-1]] != i)
{
Floyd算法求最小环
代码:
//用floyd算法 , 求有向图的最小环
#include
#include
#include
#include
using namespace std;
#define INF 0xfffffff
#define maxn 110
int grap[maxn][maxn] , n , m;
int dist[maxn][maxn];
int past[maxn][maxn];
int mincircle;
int path[maxn] , k1 ;
void init()
{
}
void floyd()
{