HDU.1874 畅通工程续 (dijkstra)
2017-07-06 19:11
597 查看
HDU.1874 畅通工程续 (Dijkstra)
题意分析
坑点比较多1. 某两点之间可能有多条通路,在跑Dij时需要用距离最小的算。
2. 当起点和重点相等的时候,距离为0
3. 点的编号从0开始。
代码总览
#include <bits/stdc++.h> #define nmax 210 using namespace std; int mp[nmax][nmax]; int dis[nmax]; bool visit[nmax]; int inf = 1e8; int n,m; void Dij(int s) { int cur = s; memset(visit,0,sizeof(visit)); visit[cur] = true; for(int i = 0;i<n;++i) dis[i] = inf; dis[cur] = 0; for(int i = 0;i<n;++i){ for(int j = 0; j<n;++j){ if(!visit[j] && dis[cur] + mp[cur][j] < dis[j]) dis[j] = dis[cur] + mp[cur][j]; } int mini = inf; for(int j = 0; j<n;++j){ if(!visit[j] && dis[j] < mini){ cur = j; mini = dis[cur]; } } visit[cur] = true; } } int main() { //freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&m) != EOF){ memset(mp,0,sizeof(mp)); for(int i = 0; i<n;++i) for(int j = 0;j<n;++j) mp[i][j] = inf; int sta,end,di; for(int i = 0;i<m;++i){ scanf("%d %d %d",&sta,&end,&di); int temp = mp[sta][end]; int ans = min(temp,di); mp[end][sta] = mp[sta][end] = ans; } scanf("%d %d",&sta,&end); Dij(sta); if(sta == end){ printf("0\n"); }else if(dis[end] == inf){ printf("-1\n"); }else{ printf("%d\n",dis[end]); } } return 0; }
相关文章推荐
- HDU 1874 畅通工程续 最短路径入门(dijkstra)
- HDU1874 畅通工程续 【链式前向星】+【Dijkstra】
- HDU--1874 -- 畅通工程续 [Dijkstra]
- HDU 1874 畅通工程续 (dijkstra模板)
- 杭电 1874 畅通工程续(Dijkstra)
- hdu 1874 畅通工程续 (Dijkstra or Floyd or Dfs)
- HDU 1874 畅通工程续 SPFA || dijkstra||floyd
- HDU 1874 畅通工程续(单源最短路之Dijkstra n^2算法)
- HDU 1874 畅通工程续 (Floyd, Dijkstra,Bellman-Ford,SPFA)
- hdu 1874 畅通工程续 (裸的 Dijkstra)
- HDU 1874:畅通工程续【Dijkstra & SPFA & Floyd】
- HDU 1874 畅通工程续 (dijkstra模板)
- HDU 1874-畅通工程续(floyd&&Dijkstra)
- 最短路径问题的几种算法(dijkstra , Floyd ,) 例 hdoj 1002 畅通工程续
- HDU 1874 畅通工程续【最短路 dijkstra & floyed & SPFA 】
- HDU 1874 畅通工程续 (dijkstra模板)
- HDUOJ1874 畅通工程续 和 NYOJ 115 城市平乱【Dijkstra 算法】
- hdu 1874 畅通工程续 【Dijkstra Floyd-Warshall算法】
- HD 1874 畅通工程续 【dijkstra】
- HDU 畅通工程续(Dijkstra)