#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 305;
const ll inf = 0x3f3f3f3f;
struct edge
{
int from,to,w;
edge(int a,int b,int c)
{
from = a,to = b,w = c;
}
};
vector<edge>e[N];
struct node
{
ll id,dis;
node(int a,int b)
{
id = a,dis = b;
}
bool operator < (const node& a) const
{
return dis > a.dis;
}
};
int n,m;
void dijkstra()
{
int s = 1;//起点
ll dis[N];
bool vis[N];
for(int i=1;i<=n;i++)
{
dis[i] = inf;
vis[i] = false;
}
dis[s] = 0;
priority_queue<node>pq;
pq.push(node(s,dis[s]));
while(!pq.empty())
{
node u = pq.top();
pq.pop();
if(vis[u.id]) continue;
vis[u.id] = true;
for(int i=0;i<e[u.id].size();i++)
{
edge y = e[u.id][i];
if(vis[y.to]) continue;
if(dis[y.to] > y.w+u.dis)
{
dis[y.to] = y.w + u.dis;
pq.push(node(y.to,dis[y.to]));
}
}
}
cout<<dis[n]<<"\n";
}
int main()
{
while(cin>>n>>m)
{
if(n==0 && m==0) return 0;
for(int i=1;i<=n;i++) e[i].clear();
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
e[a].push_back(edge(a,b,c));
e[b].push_back(edge(b,a,c));
}
dijkstra();
}
return 0;
}
模板例题:
https://ac.nowcoder.com/acm/problem/15549
#include<bits/stdc++.h>
using namespace std;
#define se second
#define fi first
typedef pair<int,int> pii;
typedef long long ll;
const int N = 2e5+5;
const int inf = 0x3f3f3f3f;
vector<pii>e[N];
ll dis[N];
bool vis[N];
void dijkstra()
{
int x = 1;
priority_queue<pii>q;
dis[x] = 0;
q.push({-dis[x],x});
while(!q.empty())
{
pii t = q.top();
q.pop();
for(int i=0;i<e[t.se].size();i++)
{
int too = e[t.se][i].fi;
if(dis[too] > dis[t.se] + e[t.se][i].se)
{
dis[too] = dis[t.se] + e[t.se][i].se;
q.push({-dis[too],too});
}
}
}
}
void spfa()
{
int s = 1;
vis[s] = 1;
dis[s] = 0;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for(int i=0;i<e[u].size();i++)
{
int v = e[u][i].fi;
if(dis[v] > dis[u]+e[u][i].se)
{
dis[v] = dis[u] + e[u][i].se;
if(!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
}
int main()
{
for(int i=1;i<=N;i++) dis[i] = inf;
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
e[a].push_back({b,c});
e[b].push_back({a,c});
}
// dijkstra();
spfa();
if(dis[n]!=inf) cout<<dis[n]<<'\n';
else cout<<"qwb baka\n";
return 0;
}
2022.2.11重做
注意边的大小开到位,然后看清楚是双向还是单向边。
vis[]
数组表示该点的最短距离是否已找到
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int N = 2e5 + 5, M = N * 2;
int h[N], e[M], ne[M], w[M], idx;
bool vis[N];
ll dis[N];
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
memset(h, -1, sizeof h);
for(int i = 1; i <= m; i++)
{
int u, v, W;
cin >> u >> v >> W;
add(u, v, W);
add(v, u, W);
}
auto dijkstra = [&](int s) -> int
{
memset(dis, 0x3f, sizeof dis);
dis[s] = 0;
priority_queue<pii, vector<pii>, greater<pii> > pq;
pq.push({0, s});
while(!pq.empty())
{
pii t = pq.top();
pq.pop();
if(vis[t.se]) continue;
vis[t.se] = true;
for(int i = h[t.se]; ~i; i = ne[i])
{
int j = e[i];
if(dis[j] > dis[t.se] + w[i])
{
dis[j] = dis[t.se] + w[i];
pq.push({dis[j], j});
}
}
}
return dis[n];
};
int res = dijkstra(1);
if(res == 0x3f3f3f3f) cout << "qwb baka\n";
else cout << res << "\n";
return 0;
}