【Horn Coding Studio】CPP编程专栏(狄克斯特拉-算法)
题目
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 ****************************************************************/