您的位置:首页 > 其它

最短路问题 Dj && Floyd 算法

2016-07-21 14:28 337 查看
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <sstream>
#define pi (acos(-1.0))
#define eps (1e-4)
#define maxn 1002
#define inf 99999999
using namespace std;

int n,e[maxn][maxn],d[maxn],book[maxn];

//对e[maxn][maxn]的初始化
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) e[i][j]=0;
else e[i][j]=inf;
}
}

void floyd() //O(N^3)
{            //不能解决负权回路
for(int k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e[i][j]>e[i][k]+e[k][j] && e[i][k]<inf && e[k][i]<inf)
e[i][j]=e[i][k]+e[k][i];
}
}
}
}

int dj(int s)// 初始点为一  O(N^2)
{           //不能解决负权回路
for(int i=1;i<=n;i++)
{
d[i]=e[s][i];
}
memset(book,0,sizeof(book));
d[s]=0;
book[s]=1;

for(int i=1;i<=n-1;i++)
{
int k,minn=inf;
for(int j=1;j<=n;j++)
{
if(book[j]==0 && d[j]<minn)
{
minn=d[j];
k=j;
}
}
book[k]=1;

for(int pp=1;pp<=n;pp++)
{
if(d[pp]>d[k]+e[k][pp])
d[pp]=d[k]+e[k][pp];
}
}
}

///////////////////////////////////////
int dijkstra(int s, int t)
{			//判断是S——T的最短距离是否存在
for (i = 1; i <= n; i++)
{
dis[i] = e[s][i];
}
memset(book, 0, sizeof(book));
dis[s] = 0;
book[s] = 1;

int minn, k;
for (i = 1; i <= n; i++)
{
minn = inf;
for (j = 1; j <= n; j++)
{
if (book[j] == 0 && minn > dis[j])
{
minn = dis[j];
k = j;
}
}
if (minn == inf)
{
break;
}
book[k] = 1;
for (j = 1; j <= n; j++)
{
if (e[k][j] < inf && book[j] == 0)
{
if (dis[j] > dis[k] + e[k][j])
{
dis[j] = dis[k] + e[k][j];
}
}
}
}
if (dis[t] == inf)
{
return -1;
}
else
{
return dis[t];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路问题 算法