以题目1502 -- MPI Maelstrom为模板题
作者是新手 如果有错误 还请指正
堆优化的dijkstra 时间复杂度(mlogn)
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
struct w
{
int to, val;
};
vector<w> vec[105];
int dis[110];
int n;
typedef pair<int, int> P;
priority_queue<P, vector<P>, greater<P>> que;
void prim(int x)
{
memset(dis, 0x3f, sizeof(dis));
dis[x] = 0;
P ttk;
ttk.first = 0;
ttk.second = 1;
que.push(ttk);
while (!que.empty())
{
P u = que.top();
que.pop();
if (u.first > dis[u.second])
continue;
for (int i = 0; i < vec[u.second].size(); i++)
{
int v = vec[u.second][i].to;
if (dis[v] > dis[u.second] + vec[u.second][i].val)
{
dis[v] = dis[u.second] + vec[u.second][i].val;
que.push(make_pair(dis[v], v));
}
}
}
}
int main()
{
cin >> n;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
if (i == j)
{
w kkyt;
kkyt.to = i;
kkyt.val = 0;
vec[i].push_back(kkyt);
continue;
}
char s[10];
scanf("%s", s);
if (s[0] != 'x')
{
int jw = 1;
int zy = 0;
for (int i = strlen(s) - 1; i >= 0; i--)
{
zy += ((s[i] - '0') * jw);
jw *= 10;
}
w kkyt;
kkyt.to = j;
kkyt.val = zy;
vec[i].push_back(kkyt);
kkyt.to = i;
vec[j].push_back(kkyt);
}
}
}
prim(1);
int ans = 0;
for (int i = 2; i <= n; i++)
{
ans = max(ans, dis[i]);
}
cout << ans << endl;
}
floyd 时间复杂度(n^3)
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
int a[110][110];
int dis[110];
int n;
int main()
{
cin >> n;
memset(a, 0x3f, sizeof(a));
memset(dis, 0x3f, sizeof(dis));
a[1][1] = 0;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
if (i == j)
{
a[i][i] = 0;
continue;
}
char s[10];
scanf("%s", s);
if (s[0] != 'x')
{
int jw = 1;
int zy = 0;
for (int i = strlen(s) - 1; i >= 0; i--)
{
zy += ((s[i] - '0') * jw);
jw *= 10;
}
a[i][j] = zy;
a[j][i] = zy;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int k = 1; k <= n; k++)
{
if (a[j][k] > a[j][i] + a[i][k])
a[j][k] = a[j][i] + a[i][k];
}
}
}
int ans = 0;
for (int i = 2; i <= n; i++)
{
ans = max(ans, a[i][1]);
}
cout << ans << endl;
return 0;
}
bellman-ford 时间复杂度(n*m)
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
int k = 0;
struct w
{
int from, to, val;
};
w vec[10010];
int dis[205];
int n;
void bellman_ford()
{
memset(dis, 0x3f, sizeof(dis));
dis[1] = 0;
int ttkk = 0;
while (!ttkk)
{
ttkk = 1;
for (int i = 1; i <= k; i++)
{
if (dis[vec[i].to] > dis[vec[i].from] + vec[i].val)
{
dis[vec[i].to] = dis[vec[i].from] + vec[i].val;
ttkk = 0;
}
}
}
}
int main()
{
cin >> n;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
if (i == j)
{
vec[++k].from = i;
vec[k].to = i;
vec[k].val = 0;
continue;
}
char s[10];
scanf("%s", s);
if (s[0] != 'x')
{
int jw = 1;
int zy = 0;
for (int i = strlen(s) - 1; i >= 0; i--)
{
zy += ((s[i] - '0') * jw);
jw *= 10;
}
vec[++k].from = i;
vec[k].to = j;
vec[k].val = zy;
vec[++k].from = j;
vec[k].to = i;
vec[k].val = zy;
}
}
}
bellman_ford();
int ans = 0;
for (int i = 2; i <= n; i++)
{
ans = max(ans, dis[i]);
}
cout << ans << endl;
return 0;
}
spfa 时间复杂度(可达到O(m)最坏情况为O(n*m))
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
struct w
{
int to, val;
};
vector<w> vec[105];
int dis[110];
int n;
int vis[110];
void spfa()
{
queue<int> que;
que.push(1);
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[1] = 0;
while (!que.empty())
{
int u = que.front();
que.pop();
vis[u] = 0;
for (int i = 0; i < vec[u].size(); i++)
{
if (dis[vec[u][i].to] > dis[u] + vec[u][i].val)
{
dis[vec[u][i].to] = dis[u] + vec[u][i].val;
if (!vis[vec[u][i].to])
{
vis[vec[u][i].to] = 1;
que.push(vec[u][i].to);
}
}
}
}
}
int main()
{
cin >> n;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
if (i == j)
{
w kkyt;
kkyt.to = i;
kkyt.val = 0;
vec[i].push_back(kkyt);
continue;
}
char s[10];
scanf("%s", s);
if (s[0] != 'x')
{
int jw = 1;
int zy = 0;
for (int i = strlen(s) - 1; i >= 0; i--)
{
zy += ((s[i] - '0') * jw);
jw *= 10;
}
w kkyt;
kkyt.to = j;
kkyt.val = zy;
vec[i].push_back(kkyt);
kkyt.to = i;
vec[j].push_back(kkyt);
}
}
}
spfa();
int ans = 0;
for (int i = 2; i <= n; i++)
{
ans = max(ans, dis[i]);
}
cout << ans << endl;
}