hdu 1874 最短路练习
2017-07-18 21:56
134 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
——————
贴上一些代码,其目的主要是记录数组模拟邻接表的写法,几种“<”重载的方法,以及spfa和dijkstra版
spfa:
邻接表数组模拟:
重载的几种形式:
——————
贴上一些代码,其目的主要是记录数组模拟邻接表的写法,几种“<”重载的方法,以及spfa和dijkstra版
spfa:
//SPFA #include<bits/stdc++.h> using namespace std; const int maxn=205; struct node { int point,edge; }; vector<node>e[maxn]; int n,m; int dis[maxn],inq[maxn]; queue<int>q; void init() { int i; for(i=0;i<maxn;++i) e[i].clear(); for(i=0;i<maxn;++i) dis[i]=1e9; for(i=0;i<maxn;++i) inq[i]=0; } int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(i=0;i<m;++i) { int x,y,z; node a1,a2; scanf("%d%d%d",&x,&y,&z); a1.point=y;a2.edge=a1.edge=z; a2.point=x; e[x].push_back(a1); e[y].push_back(a2); } int s,t; scanf("%d%d",&s,&t); q.push(s);inq[s]=1;dis[s]=0; while(!q.empty()) { int now; now=q.front(); q.pop();inq[now]=0; int len; len=e[now].size(); for(i=0;i<len;++i) { int v=e[now][i].point; int value=e[now][i].edge; if(dis[v]>dis[now]+value) { dis[v]=dis[now]+value; if(!inq[v]) q.push(v); inq[v]=1; } } } if(dis[t]==1e9) printf("-1\n"); else printf("%d\n",dis[t]); } return 0; }
邻接表数组模拟:
//dijkstra #include<bits/stdc++.h> using namespace std; const int maxn=205,maxm=1e5+7; int n,m; int sz; int fir[maxn],nxt[maxm],to[maxm],val[maxm]; void add(int x,int y,int z) { nxt[++sz]=fir[x]; fir[x]=sz; to[sz]=y; val[sz]=z; } //vector<pair<int,int> >e[maxn]; int dis[maxn]; priority_queue<pair<int,int> >q; void init() { sz=0; for(int i=0;i<maxn;++i) { dis[i]=1e9; fir[i]=0; } } int main() { int i ,j,k; while(cin>>n>>m) { init(); for(i=0;i<m;++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); //e[x].push_back(make_pair(y,z)); //e[y].push_back(make_pair(x,z)); } int s,t; scanf("%d%d",&s,&t); dis[s]=0;q.push(make_pair(-dis[s],s)); while(!q.empty()) { int now=q.top().second; q.pop(); for(int u=fir[now];u;u=nxt[u]) { int v=to[u]; int value=val[u]; if(dis[v]>dis[now]+value) { dis[v]=dis[now]+value; q.push(make_pair(-dis[v],v)); } } } if(dis[t]==1e9) printf("-1\n"); else printf("%d\n",dis[t]); } return 0; }
重载的几种形式:
// dijkstra // hdu 1878 #include<bits/stdc++.h> using namespace std; const int maxn=206; struct edge{ int v,va; }; vector<edge>e[maxn]; struct data{ int d,p; friend bool operator<(data a,data b) { return a.d>b.d; } // bool operator<(const data &a) const{ // return a.d<d; // } }; /* bool operator < (const data &a,const data &b) { if(a.d>b.d) return 1; return 0; } bool operator < (const data a,const data b) { if(a.d>b.d) return 1; return 0; } bool operator < (data a,data b) { if(a.d>b.d) return 1; return 0; } */ priority_queue<data>q; int n,m; int dis[maxn]; void prein() { for(int i=0;i<maxn;++i) { e[i].clear(); dis[i]=1e9; } } int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { prein(); for(i=0;i<m;++i) { int x,y,z; scanf("%d%d%d",&x,&y,&z); edge te; te.v=y;te.va=z;e[x].push_back(te); te.v=x;e[y].push_back(te); } int s,t; scanf("%d%d",&s,&t); dis[s]=0; data temp; temp.d=dis[s];temp.p=s; q.push(temp); while(!q.empty()) { int now=q.top().p; q.pop(); int len=e[now].size(); for(i=0;i<len;++i) { int v=e[now][i].v; int va=e[now][i].va; if(dis[v]>dis[now]+va) { dis[v]=dis[now]+va; temp.d=dis[v];temp.p=v; q.push(temp); } } } if(dis[t]==1e9) dis[t]=-1; printf("%d\n",dis[t]); } return 0; }
相关文章推荐
- hdu 1874 畅通工程续(最短路)
- HDU1874 畅通工程续(最短路)
- 最短路-四种算法复杂度分析比较 HDU-1874 畅通工程
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
- hdu 1874最短路flody
- hdu1874 畅通工程续 (最短路)
- HDU 1874 畅通工程续 【最短路入门题】
- HDU 1874 畅通工程续 (最短路)
- HDU - 1874 - 畅通工程续 【单源最短路 利用 dijkstra || spfa 解决】
- hdu1874 畅通工程续(最短路)
- acm-最短路 畅通工程续 (hdu 1874)
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
- hdu 1874 畅通工程续【裸最短路】
- HDU 1874 畅通工程续(单源最短路之Dijkstra n^2算法)
- HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,floyd水
- hdu1874我的第一篇最短路
- 【1874】畅通工程续 (最短路四种算法)(HDU)
- hdu 1874 畅通工程续(最短路spfa)
- HDU 1874 畅通工程续【最短路,Dijkstra算法+spfa算法】
- HDU 1874 畅通工程续【最短路 dijkstra & floyed & SPFA 】