poj 1734 Floyd算求有向圖的最小環
阿新 • • 發佈:2019-02-20
題意:旅遊公司要開發一條新的路線 , 要求這是一個總路程儘可能短的環 , 並且不能只含兩個城市 , 除開起點外 ,
不能重複走之前走過的城市 , 輸出這條路線?
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()
{
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)
{