http://acm.hdu.edu.cn/showproblem.php?pid=2544
大水题一枚,仅以练手。
Dijkstra:
#include<iostream>
using namespace std;
#define SIZE 200
#define INF 0xfffffff
#define MIN(a,b) a>b?b:a
int G[SIZE][SIZE];
int d[SIZE];
int vis[SIZE];
int N,M;
int minV()
{
int i,v;
for(i=0;i<N;i++)
{
if(!vis[i])
{
v = i;
break;
}
}
for(;i<N;i++)
if(!vis[i]&&d[v]>d[i])
v = i;
return v;
}
int Dijkstra(int s)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<N;i++)d[i]=INF;
d[s] = 0;
for(int i=0;i<N;i++)
{
int v = minV();
vis[v] = true;
for(int u=0;u<N;u++)
{
if(G[v][u])
{
d[u] = MIN(d[u],d[v]+G[v][u]);
}
}
}
return d[N-1];
}
int main()
{
while(cin>>N>>M,N||M)
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
G[i][j] = INF;
int a,b;
for(int i=0;i<M;i++)
{
int c;
cin>>a>>b>>c;
a--,b--;
if(c<G[a][b])
G[a][b] = G[b][a] = c;
}
cout<<Dijkstra(0)<<endl;
}
return 0;
}
Dijkstra+Priority_Queue:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int v;
int dis;
node(){}
node(int vv,int diss):v(vv),dis(diss){}
bool operator<(const node &n) const
{
return dis>n.dis;
}
};
typedef priority_queue<node> PQ;
const int SIZE = 110;
const int INF = 0xfffffff;
int vis[SIZE];
int dis[SIZE];
int G[SIZE][SIZE];
#define MIN(a,b) a>b?b:a
void init()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<SIZE;i++)dis[i]=INF;
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE;j++)
G[i][j] = INF;
}
int Dijkstra(int s,int n)
{
dis[s] = 0;
PQ pq;
pq.push(node(s,dis[s]));
for(int i=0;i<n;i++)
{
int v;
do
{
if(pq.empty())return INF;
v = pq.top().v;
pq.pop();
}while(vis[v]);
vis[v] = 1;
for(int j=0;j<n;j++)
{
if(G[v][j])
{
dis[j] = MIN(dis[j],dis[v]+G[v][j]);
pq.push(node(j,dis[j]));
}
}
}
return dis[n-1];
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
init();
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
a--,b--;
if(G[a][b]>c)
G[a][b]=G[b][a]=c;
}
cout<<Dijkstra(0,n)<<endl;
}
return 0;
}
Floyd:
#include<iostream>
using namespace std;
const int SIZE = 110;
int G[SIZE][SIZE];
const int INF = 0xfffffff;
#define rep(n,i) for(int i=0;i<n;i++)
void init(int n)
{
rep(n,i)
{
rep(n,j)G[i][j] = INF;
}
}
int Floyd(int n)
{
rep(n,k)
{
rep(n,i)
{
rep(n,j)
{
if(G[i][j]>G[i][k]+G[k][j])
{
G[i][j] = G[i][k]+G[k][j];
}
}
}
}
return G[0][n-1];
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
int a,b,c;
init(n);
rep(m,i)
{
cin>>a>>b>>c;
a--,b--;
if(G[a][b]>c)
{
G[a][b] = G[b][a] = c;
}
}
cout<<Floyd(n)<<endl;
}
return 0;
}
Bellman_Ford:
#include<iostream>
using namespace std;
struct Edge
{
int s,e;
Edge(){}
Edge(int ss,int ee):s(ss),e(ee){}
};
const int SIZE = 20010;
Edge edge[SIZE];
int G[110][110];
int d[110];
void init()
{
for(int i=0;i<110;i++)
for(int j=0;j<110;j++)
G[i][j] = 0xfffffff,d[i]=0xfffffff;
}
void Relax(int u,int v)
{
if(d[v]>d[u]+G[u][v])
d[v] = d[u]+G[u][v];
}
void Bellman_Ford(int n,int m)
{
d[0] = 0;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<m;j++)
Relax(edge[j].s,edge[j].e);
}
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
init();
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
a--,b--;
if(G[a][b]>c)
{
G[a][b] = G[b][a] = c;
}
}
int cnt = 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(G[i][j]!=0xfffffff)
{
edge[cnt].s = i;
edge[cnt].e = j;
cnt++;
}
}
Bellman_Ford(n,cnt);
cout<<d[n-1]<<endl;
}
return 0;
}
SPFA:
#include<iostream>
using namespace std;
#include<queue>
#define N 110
#define INF 0xfffffff
int vis[N];
int map[N][N];
int d[N];
void spfa(int s,int n)
{
memset(vis,0,sizeof(vis));
memset(d,127,sizeof(d));
d[s] = 0;
vis[s] = 1;
queue<int> q;
q.push(s);
while(!q.empty())
{
int v = q.front();
q.pop();
vis[v] = 0;
for(int i=0;i<n;i++)
{
if(map[v][i])
{
if(map[v][i]+d[v]<d[i])
{
d[i] = map[v][i]+d[v];
if(!vis[i])
{
vis[i] = 1;
q.push(i);
}
}
}
}
}
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
memset(map,0,sizeof(map));
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
a--,b--;
if(map[a][b]==0||map[a][b]>c)
map[a][b] = map[b][a] = c;
}
spfa(0,n);
cout<<d[n-1]<<endl;
}
return 0;
}
分享到:
相关推荐
我们将深入学习几种常见的最短路算法,并了解它们在MATLAB环境中的实现。 1. Dijkstra算法:Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻提出的,用于解决单源最短路径问题。它以贪心策略为基础,每次选取...
这里我们将深入探讨几种常见的最短路算法及其应用。 1. **Floyd-Warshall算法**: 这是一种动态规划方法,适用于解决所有顶点对之间的最短路径。Floyd-Warshall算法通过不断尝试所有可能的中间节点来更新距离矩阵...
《K最短路算法实现详解》 在计算机科学与图论领域,K最短路算法(K-Shortest Paths,简称KSP)是一项用于寻找网络中源节点到目标节点前K条最短路径的算法。它广泛应用于交通规划、网络优化、数据通信等多个领域。...
C#实现Dijkstra算法通常包括以下几个步骤: 1. **初始化**:创建一个优先队列,将源节点放入队列并设置其距离为0,其他所有节点距离设为无穷大。同时,创建一个邻接矩阵或邻接表来存储图的信息。 2. **主循环**:...
最短路算法和次短路算法就是解决这类问题的关键技术。本资源提供了基于MATLAB实现的这两种算法的程序源代码,对于学习和研究算法有着重要的价值。 MATLAB是一种强大的数学计算和编程环境,它以其简洁的语法和丰富的...
最长路算法和最短路算法在MATLAB中的实现 在计算机科学和信息论中,图论是研究图的数学理论和算法的一门学科。图论有很多实际应用,如网络拓扑结构、交通网络、社交网络等。在图论中,寻找从一个节点到其他节点的...
Java版的K最短路算法Yen是一种在图论领域广泛应用的算法,主要解决网络中的路径寻找问题。在交通咨询系统、物流规划、电信网络优化等领域都有它的身影。本项目是一个用Java语言实现的Yen算法,对于学习和理解算法...
它包含以下几个主要步骤: 1. **初始化**:设置初始温度T和初始解s,通常初始解可以随机生成。 2. **接受准则**:以概率e^(-ΔE/T)接受新解,其中ΔE是新旧解之间的能量差,T是当前温度。 3. **降温策略**:根据...
Label-Setting算法是一种常用的最短路算法,它通过对图中的每个顶点分配一个距离标记(Label),来记录从源点到该顶点的最短距离。Label-Setting算法的关键是如何维护距离标记,并选择下一个加入最短路径树的顶点。 ...
最短路径问题可以分为几类: 1. **确定起点的最短路径问题**:已知起始结点,求解该结点到图中其他所有结点的最短路径。 2. **确定终点的最短路径问题**:与确定起点的问题相反,已知终点结点,求解图中所有结点到...
【标题】"TSP用遗传算法做最短路环游中国的MATLAB代码"涉及的核心知识点是旅行商问题(Travelling Salesman Problem, TSP)的解决方案,它是一个经典的组合优化问题,旨在寻找访问每座城市一次并返回起始城市的最短...
该算法的步骤可以概括为以下几个步骤: 1. 初始化:将所有节点的距离设置为无穷大,除了起始点设置为 0。 2. 选择节点:选择当前距离最小的节点作为当前节点。 3. 更新距离:将当前节点的邻居节点的距离更新为当前...
从给定的文件标题“java最短路算法代码”及描述来看,这段代码涉及的是Java编程语言中的图形绘制方法以及一个具体的最短路径算法——弗洛伊德算法(Floyd Algorithm)的实现。下面我们将详细解析这段代码所涵盖的...
最短路算法主要包括以下几种: 1. **Dijkstra算法**:这是最常用的单源最短路径算法,适用于非负权重的图。Dijkstra算法通过维护一个优先队列(如二叉堆)来逐步扩展最短路径树,直到到达目标节点。每次从队列中...
如题,这是 CSP-J 2023 第二轮的第四题,属于最短路算法,考虑使用 Dijkstra 算法。 但是,跟模板不同的是,这道题中有一些限制条件。比如走某条路必须在某个时刻点以后,这就导致到中间耗时最少的路径反而走不通,...
1. **最短路算法**:最短路问题是在图中找到从一个起点到其他所有顶点的最短路径。Dijkstra算法是最常用的单源最短路径算法,适用于有向无权图或非负权重图。Floyd-Warshall算法则可以解决所有对间的最短路径问题,...
《k最短路算法解析与实现》 在图论领域,寻找从源节点到目标节点的最短路径是一项基础且重要的任务。而当我们要寻找不仅仅是单条,而是多条具有不同权重的最短路径时,k最短路算法就显得尤为关键。本文将深入探讨k...