Hihocoder1081 最短路径 继续结构题
Posted ---学习ing---
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hihocoder1081 最短路径 继续结构题相关的知识,希望对你有一定的参考价值。
最短路径 :虽然做过很多次最短路的题,spfa,bellman,floyd都用过不少。但是题目强调的“顺序”又让我加深了对最短路的理解。
当然,主要还是练习下STL:
pair型:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<memory> #include<queue> using namespace std; const int maxn=1010; const int maxm=20010; const int inf=1e9; int dis[maxn],n,m,s,t; int Laxt[maxm],Next[maxm],To[maxm],Len[maxm],cnt,in[maxn]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int > > >q; void add(int u,int v,int d) { Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=d; } void spfa() { while(!q.empty()){ int u=q.top().second;q.pop(); in[u]=0; for(int i=Laxt[u];i;i=Next[i]){ int v=To[i]; if(dis[v]>dis[u]+Len[i]){ dis[v]=dis[u]+Len[i]; if(!in[v]) { in[v]=1; q.push(make_pair(dis[v],v)); } } } } } int main() { int i,j,k,u,v,d; scanf("%d%d%d%d",&n,&m,&s,&t); for(i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&d); add(u,v,d); add(v,u,d); } for(i=1;i<=n;i++) dis[i]=inf; dis[s]=0; in[s]=1; q.push(make_pair(0,s)); spfa(); printf("%d\n",dis[t]); return 0; }
struct型
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<memory> #include<queue> using namespace std; const int maxn=1010; const int maxm=20010; const int inf=1e9; int dis[maxn],n,m,s,t; int Laxt[maxm],Next[maxm],To[maxm],Len[maxm],cnt,in[maxn]; struct pii { int dist; int node; pii(int a,int b):dist(a),node(b){}//赋值 bool friend operator <(pii a,pii b){//重载 return a.dist>b.dist; } }; priority_queue<pii>q; void add(int u,int v,int d) { Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=d; } void spfa() { while(!q.empty()){ int u=q.top().node;q.pop(); in[u]=0; for(int i=Laxt[u];i;i=Next[i]){ int v=To[i]; if(dis[v]>dis[u]+Len[i]){ dis[v]=dis[u]+Len[i]; if(!in[v]) { in[v]=1; pii tmp(dis[v],v); q.push(tmp); } } } } } int main() { int i,j,k,u,v,d; scanf("%d%d%d%d",&n,&m,&s,&t); for(i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&d); add(u,v,d); add(v,u,d); } for(i=1;i<=n;i++) dis[i]=inf; dis[s]=0; in[s]=1; pii tmp(0,s); q.push(tmp); spfa(); printf("%d\n",dis[t]); return 0; }
以上是关于Hihocoder1081 最短路径 继续结构题的主要内容,如果未能解决你的问题,请参考以下文章