【C++】ZZ2193-城市之路 解题精讲
【Horn Coding Studio】CPP编程专栏(狄克斯特拉-算法)
题目
题目描述
罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。 现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
输入
输入n, m,表示n个城市和m条路; 接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
输出
输出1到n的最短路。如果1到达不了n,就输出-1。
样例输入 复制
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出 复制
90
知识点普及
无。
一点即通
十分简单的狄克斯特拉
不能单用邻接矩阵,而是要加上min函数,留下两个城市可以直接相连的最短路径,不然的话是WA的.
就是这句话!
我们需要定义一个结构体,但是!我们还需要再输入后排个序,不然………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
因此,我们需要专门为她写一个以w为排序的代码,
bool
operator <(
const
qnode &r)
const
{
return
w>r.w;
}
另外由于这是一个双向图,我们的add函数需要运行两次,分别是:
a,b,c;
b,a,c;
接下来,就是万古不变的标准代码了!
代码
ZZOJ 100%AC,5052KB空间复杂度,13MS优秀时间复杂度。
Luogu OJ 没有这道题目
#include<bits/stdc++.h> #define INF 1e9 #define maxn 100005 using namespace std; int n,m; struct edge{ int u; int to; int w; int next; }edge[maxn]; int head[maxn],cnt; void add(int a,int b,int c){ edge[cnt].to=b; edge[cnt].w=c; edge[cnt].next=head[a]; head[a]=cnt; cnt++; }struct qnode{ int u,w; bool operator <(const qnode &r) const{ return w>r.w; } }; priority_queue<qnode> que; int dis[maxn],vis[maxn]; int DJ(int st,int ed){ for(int i=1;i<=n;i++){ dis[i]=INF; }dis[st]=0; que.push({st,0}); while(que.size()){ qnode tmp=que.top(); que.pop(); int u=tmp.u; if(vis[u]) continue; vis[u]=1; for(int i=head[u];i!=-1;i=edge[i].next){ int to=edge[i].to; if(dis[to]>dis[u]+edge[i].w){ dis[to]=dis[u]+edge[i].w; que.push({to,dis[to]}); } } }if(dis[ed]==INF) dis[ed]=-1; return dis[ed]; }int main(){ cin>>n>>m; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); }cout<<DJ(1,n); return 0; } /************************************************************** User: FZK Language: C++ Result: 正确 Time:13 ms Memory:5052 kb ****************************************************************/