HDU 1874 畅通工程续 最短路Dijkstra模板题 发表于 2017-05-15 | 分类于 算法 | 阅读次数: 字数统计: 371 字 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题意&题解裸的最短路,注意重边问题。以此题来代表Dijkstra模板(邻接矩阵) 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<ctime>#include<iostream>#include<queue>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fconst int maxn=205;const int maxm=2005;int cost[maxn][maxn]; //邻接矩阵建图int d[maxn];bool used[maxn]; //表示是否被收录int V,E;//建图void build(){ memset(d,INF,sizeof(d)); memset(cost,INF,sizeof(cost)); //初始化邻接矩阵 int u,v,w; for(int i=0;i<E;i++) { scanf("%d %d %d",&u,&v,&w); cost[u][v]=cost[v][u]=min(cost[v][u],w); //去重边操作 }}void dijkstra(int s){ fill(d,d+V,INF); fill(used,used+V,false); d[s]=0; while(true) { int v=-1; //从未被收录的点中找出一个距离最小的点 for(int j=0;j<V;j++) { if(!used[j]&&(v==-1||d[j]<d[v]))v=j; //v==-1设置哨兵,确定有没有没被收录的点 } if(v==-1) break; used[v]=true; for(int i=0;i<V;i++) d[i]=min(d[i],d[v]+cost[v][i]); //松弛操作 }}void solve(){ int S,T; while(scanf("%d %d",&V,&E)!=EOF) { build(); scanf("%d %d",&S,&T); dijkstra(S); int ans=d[T]; printf("%d\n",ans==INF?-1:ans); }}int main(){ freopen("input.txt","r",stdin); solve(); return 0;} 赏 WeChat Pay Alipay 本文作者: Sixzeroo 本文链接: https://www.liuin.cn/2017/05/15/HDU-1874-畅通工程续-最短路Dijkstra模板题/ 发布时间: 2017年5月15日 - 00时05分 最后更新: 2019年1月6日 - 14时01分 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!