图的最短距离问题
1.dijkstra(无法求负边)
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N = 3e5;
int n, m, s, t;
vector<pair<int, int> > g[N];
int dis[N];
int st[N];
void dij() {
memset(dis,0x3f,sizeof(dis));
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
pq.push({0,s});
while (pq.size())
{
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (st[u])continue;
st[u] = 1;
for (auto i : g[u])
{
int v = i.first;
int w = i.second;
if (dis[v] > d + w){
dis[v] = d + w;
pq.push({dis[v],v});
}
}
}
cout << dis[t];
}
signed main()
{
std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
cin >> n >> m >> s >> t;
for (int i = 0;i <m;i++)
{
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dij();
return 0;
}
2.贝尔特佛特(可以求负边)
int n, m; // n表示点数,m表示边数
int dist[N]; // dist[x]存储1到x的最短路距离
struct Edge // 边,a表示出点,b表示入点,w表示边的权重
{
int a, b, w;
}edges[M];
// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
// 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
int a = edges[j].a, b = edges[j].b, w = edges[j].w;
if (dist[b] > dist[a] + w)
dist[b] = dist[a] + w;
}
}
if (dist[n] > 0x3f3f3f3f / 2) return -1;
return dist[n];
}
3.Floyd(dp思想)
for (k = 1; k <= n; k++) {
for (x = 1; x <= n; x++) {
for (y = 1; y <= n; y++) {
f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
}
}
}
上述算法,dijkstra时间复杂度最低,Floyd最好n的三次方,但是可以求图上连通点之间的最短距离
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N = 3e5;
int n, m, s, t;
vector<pair<int, int> > g[N];
int dis[N];
int st[N];
void dij() {
memset(dis,0x3f,sizeof(dis));
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
pq.push({0,s});
while (pq.size())
{
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (st[u])continue;
st[u] = 1;
for (auto i : g[u])
{
int v = i.first;
int w = i.second;
if (dis[v] > d + w){
dis[v] = d + w;
pq.push({dis[v],v});
}
}
}
cout << dis[t];
}
signed main()
{
std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
cin >> n >> m >> s >> t;
for (int i = 0;i <m;i++)
{
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dij();
return 0;
}
2.贝尔特佛特(可以求负边)
int n, m; // n表示点数,m表示边数
int dist[N]; // dist[x]存储1到x的最短路距离
struct Edge // 边,a表示出点,b表示入点,w表示边的权重
{
int a, b, w;
}edges[M];
// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
// 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
int a = edges[j].a, b = edges[j].b, w = edges[j].w;
if (dist[b] > dist[a] + w)
dist[b] = dist[a] + w;
}
}
if (dist[n] > 0x3f3f3f3f / 2) return -1;
return dist[n];
}
3.Floyd(dp思想)
for (k = 1; k <= n; k++) {
for (x = 1; x <= n; x++) {
for (y = 1; y <= n; y++) {
f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
}
}
}
上述算法,dijkstra时间复杂度最低,Floyd最好n的三次方,但是可以求图上连通点之间的最短距离
全部评论
相关推荐
点赞 评论 收藏
分享
03-19 01:17
大连东软信息学院 人工智能
机智的豹子有点心碎:UU我还在找工作还没找到,一直在搜简历怎么改,总结了这些:
1.SEO:简历根据每一个岗位定制化:使用这个岗位中所描述的工作的词,它要求什么技能就把自己的技能描述成什么样子,把SEO用在自己身上(把我的简历和个人特质,当成一个热门产品来做 “搜索引擎优化”),让HR能用最低的门槛看到我
2."顺序:把岗位要求的技能跟经历放在简历的最开头、最显眼的位置"
3.包装:简历是一个最终交付说明书,只要最终学习成长做得到就可以,在合适的范围内自我吹捧(我这个人怎么能够在HR的角度被迅速的看懂和看到,减轻HR的工作压力)
4.每点加小标题:用6~10字概括该段内容,便于面试官快速抓取信息。
5.避免空泛描述:拒绝“培养了组织能力”等泛泛而谈,替换为具体行动和成果。
6."使用“三段式结构”:每段经历按“为什么做-做了什么-结果如何”展开:
a) 为什么做:痛点或目标(例如“品牌声量不足”)
b) 做了什么:方法论(例如“趋势洞察+竞品对标+人群细分”)
c) 结果如何:量化成果或影响(例如“推动客户投放20万预算”)"
7.量化成果:用数字体现工作成效(如“整理500+份资料”“撰写2万字报告”)。
这些有的是我想去的岗的,如果对你有用的话按需修改就好~加油,早日上岸! 点赞 评论 收藏
分享
讲原则的小黄鸭不愿吃...:有时候面试眼缘确实很重要,当然,飞驰人生2中张弛说的很对:我努力了无数次,但是我知道机会只会出现在其中一两次。你把每一次笔试面试都全力以赴,总有你运气发挥到位的时候 点赞 评论 收藏
分享
