Floyd写法,我认为最简单的一种 。。。
int floyd()
{
for (int i = 1; i <= n; i++)//以i节点为中转点,从j->i->k,计算路径长度
{
for (int j = 1; j <= n; j++)
{
for (int k = 1; k <= n; k++)
{
edge[j][k] = min(edge[j][k], edge[j][i] + edge[i][k]);
}
}
}
return edge[1][n];
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
edge[i][j] = inf;
edge[i][i] = 0;
}
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> c;
edge[a][b] = c;
}
memset(vis, 0, sizeof(vis));
vis[1] = 1;
MinPath = inf;
MinPath = floyd();
cout << MinPath << endl;
return 0;
}
DFS写法
#include<bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
int MinPath = inf, n,m,a,b,c;
int edge[1001][1001], vis[1001];
void DFS(int cur, int dis)
{
if (MinPath < dis) return;
if (cur == n)
{
if (MinPath > dis) MinPath = dis;
return;
}
for (int i = 1; i <= n; i++)
{
if (edge[cur][i] != inf && edge[cur][i] != 0 && vis[i] == 0)
{
vis[i] = 1;
DFS(i, dis + edge[cur][i]);
vis[i] = 0;
}
}
return;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
edge[i][j] = inf;
edge[i][i] = 0;
}
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> c;
edge[a][b] = c;
}
memset(vis, 0, sizeof(vis));
vis[1] = 1;
MinPath = inf;
DFS(1, 0);
cout << MinPath << endl;
return 0;
}
Dijkstra写法
#include<bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
int vis[10001],n,m,edge[1001][1001],dis[10001],a,b,c;
int dijkstra(int start)
{
dis[start] = 0;
for(int k=1;k<=n;k++)
{
for (int i = 1; i <= n; i++)
{
int p = 1, MIN = inf;
if (!vis[i] && dis[i] < MIN)
{
MIN = dis[i];
p = i;
}
vis[p] = 1;
for (int j = 1; j <= n; j++)
if (!vis[j]) dis[j] = min(dis[j], dis[p] + edge[p][j]);
}
}
return dis[n];
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
edge[i][j] = inf;
edge[i][i] = 0;
}
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> c;
edge[a][b] = c;
}
for (int i = 1; i <= n; i++)
dis[i] = edge[1][i];
int MINPATH = dijkstra(1);
cout << MINPATH << endl;
return 0;
}
还有两种写法没学,明天补上。。。。
希望以后能不摆烂。
如有错误,望指正。