HDOJ1874 畅通工程续 (Dijkstra)
来源:互联网 发布:js onclick function 编辑:程序博客网 时间:2024/05/17 08:08
题意分析
1. 某两点之间可能有多条通路,在跑Dij时需要用距离最小的算。
2. 当起点和重点相等的时候,距离为0
3. 点的编号从0开始。
题目给定了起点和终点,要求两点之间的最短距离。很明显的Dijkstra算法。(从源点到其余各顶点之间的最短路径)
Dijkstra算法(O^2)
#include<iostream>#include<cstdlib>#include<string.h>#include<algorithm>using namespace std;#define inf 1<<30#define maxn 300int n,m;int map[maxn][maxn];int vis[maxn],dis[maxn];void Dijkstra(int s,int e){ int i,j,min,pos; memset(vis,0,sizeof(vis)); dis[s]=0;vis[s]=1; //源点(起点) for(i=0;i<n;i++) dis[i]=map[s][i]; //dis[i]指源点到点i的距离 for(i=1;i<n;i++){ min=inf; for(j=0;j<n;j++){ if(dis[j]<min && !vis[j]){ pos=j; min=dis[j]; } } vis[pos]=1; for(j=0;j<n;j++){ //松弛(relaxtion) if(dis[j]>dis[pos]+map[pos][j]&&!vis[j]) dis[j]=dis[pos]+map[pos][j]; } }}int main(){ int i,j,x,y,z,sta,end; while(~scanf("%d%d",&n,&m))//n个城镇,m条道路 { for(i=0;i<n;i++) { for(j=0;j<n;j++) map[i][j]=inf; map[i][i]=0; } for(i=0;i<m;i++) { scanf("%d%d%%d",&x,&y,&z); if(z<map[x][y]) map[x][y]=map[y][x]=z; } scanf("%d%d",&sta,&end); Dijkstra(sta,end); //判断有没有最短路径 printf("%d\n",dis[end]=inf?-1:dis[end]); }return 0; }
Dijkstra算法(nlogn)优化
#include <stdio.h>#include <queue>#include <string.h>#include <algorithm>using namespace std;const int inf = 1<<30;const int L = 1000+10;struct Edges{ int x,y,w,next;};struct node{ int d; int u; node (int dd = 0,int uu = 0):d(dd),u(uu) {} bool operator < (const node &x) const { return u>x.u; }};priority_queue<node> Q;Edges e[L<<2];int head[L];int dis[L];int vis[L];void AddEdge(int x,int y,int w,int k){ e[k].x = x,e[k].y = y,e[k].w = w,e[k].next = head[x],head[x] = k++; e[k].x = y,e[k].y = x,e[k].w = w,e[k].next = head[y],head[y] = k++;}void init(int n,int m){ int i; memset(e,-1,sizeof(e)); for(i = 0; i<n; i++) { dis[i] = inf; vis[i] = 0; head[i] = -1; } for(i = 0; i<2*m; i+=2) { int x,y,w; scanf("%d%d%d",&x,&y,&w); AddEdge(x,y,w,i); }}int Dijkstra(int n,int src){ node mv; int i,j,k,pre; vis[src] = 1; dis[src] = 0; Q.push(node(src,0)); for(pre = src,i = 1; i<n; i++) { for(j = head[pre]; j!=-1; j=e[j].next) { k = e[j].y; if(!vis[k] && dis[pre]+e[j].w<dis[k]) { dis[k] = dis[pre]+e[j].w; Q.push(node(e[j].y,dis[k])); } } while(!Q.empty()&&vis[Q.top().d]==1) Q.pop(); if(Q.empty()) break; mv = Q.top(); Q.pop(); vis[pre=mv.d] = 1; }}int main(){ int n,m,i,j,x,y; while(~scanf("%d%d",&n,&m)) { init(n,m); scanf("%d%d",&x,&y); Dijkstra(n,x); printf("%d\n",dis[y]==inf?-1:dis[y]); } return 0;}
阅读全文
0 0
- HDOJ1874 畅通工程续 (Dijkstra)
- hdoj1874 畅通工程续
- <hdoj1874>畅通工程续
- HDOJ1874-畅通工程续
- HDOJ1874 畅通工程续(floyd)
- Dijkstra--畅通工程续
- hdu1874畅通工程续 (dijkstra)
- hdu1874 畅通工程续(Dijkstra)
- hdu1874畅通工程续dijkstra
- HDU1874 畅通工程续【Dijkstra】
- 【HDU1874】畅通工程续【dijkstra】
- 畅通工程续(dijkstra)
- HDU1874-畅通工程续(Dijkstra)
- hdu 1874畅通工程续 dijkstra
- 畅通工程续 最短路径 Dijkstra
- hdu 1874 畅通工程续 (dijkstra算法)
- HDU1874 畅通工程续 解题报告--Dijkstra
- HDU--1874 -- 畅通工程续 [Dijkstra]
- linux gcc 静态编译和动态编译
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
- tarjan算法求连通分量+缩点后重新建图
- poj 1787 Charlie's Change【多重背包可行性+记录路径】
- 机器学习
- HDOJ1874 畅通工程续 (Dijkstra)
- HTTP,TCP,UDP,Socket,WebSocket
- 海明码校验
- 杭电acm 5687Problem C(字典树)
- .NET出现频率非常高的笔试题
- hdu1754 I Hate It 线段树
- Springmvc的全局异常处理
- docker基本使用
- 迁移学习