hihoCoder1081 1089 1093 :最短路径
来源:互联网 发布:人工智能高端人才 编辑:程序博客网 时间:2024/05/08 03:06
hihoCoder1081 最短路径一
题目连接:http://hihocoder.com/problemset/problem/1081
分析:求单源最短路径,点集和边集都不大,邻接矩阵存储即可。
Dijkstra算法实现代码如下:
#include <cstdio>#include <iostream>#define INF 999999999#define MAX 10005using namespace std;int s[MAX];int dist[MAX],ans[MAX][MAX];void Dijkstra(int n,int v){ int newdist,temp,u,i,j; for(i=1; i<=n; i++) { dist[i]=ans[v][i]; s[i]=0; } dist[v]=0; s[v]=1; for(i=1; i<=n; i++) { temp=INF; u=v; for(j=1; j<=n; j++) if((!s[j])&&(dist[j]<temp)) { u=j; temp=dist[j]; } s[u]=1; for(j=1; j<=n; j++) if((!s[j])&&(ans[u][j]<INF)) { newdist=dist[u]+ans[u][j]; if(newdist<dist[j]) dist[j]=newdist; } }}int main(){ int m,n,start,end; int a,b,t; scanf("%d%d%d%d",&n,&m,&start,&end); for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) ans[i][j]=INF; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&t); if(ans[a][b]>t) { ans[a][b]=t; ans[b][a]=t; } } Dijkstra(n,start); printf("%d\n",dist[end]); return 0;}
hihoCoder1089 最短路径二:Floyd算法
题目链接:http://hihocoder.com/problemset/problem/1089
分析:题目都已经说的这么明确了==。毕竟,求任意两点之间的最短路Floyd比Dijkstra效率是要高很多。
实现代码如下:
#include <cstdio>#include <iostream>#define INF 999999999#define MAX 1005using namespace std;int dist[MAX][MAX];void Floyd(int n){ int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { int temp=dist[i][k]+dist[k][j]; if(dist[i][j]>temp) dist[i][j]=temp; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%d ",dist[i][j]); printf("\n"); }}int main(){ int m,n; int a,b,t; scanf("%d%d",&n,&m); for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) dist[i][j]=INF; for(int i=0;i<=n;i++) dist[i][i]=0; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&t); if(dist[a][b]>t) { dist[a][b]=t; dist[b][a]=t; } } Floyd(n); return 0;}
hihoCoder1093 最短路径三:SPFA算法
题目链接:http://hihocoder.com/problemset/problem/1093
分析:SPFA不如Dijkstra算法稳定的原因就在于:SPFA对于稀疏图(图中边数较少)有着比较高的效率。本题已经说的很明确了:“鬼屋很大,但道路并不多”,加之m和n的范围比较大,不能用邻接矩阵,这里用vector容器来装了。
实现代码如下:
#include <cstdio>#include <iostream>#include <queue>#include <vector>using namespace std;#define INF 0x7fffffff#define MAX 100005struct edge{ int to,w;};int dis[MAX];bool vis[MAX];int n,m,start,e;vector <edge> vec[MAX];void SPFA(){ for(int i=1;i<=n;i++) { dis[i]=INF; vis[i]=false; } dis[start]=0; queue<int> que; que.push(start); vis[start]=true; while(!que.empty()) { int tmp=que.front(); que.pop(); vis[tmp]=false; for(int i=0;i<vec[tmp].size();i++) { edge cnt=vec[tmp][i]; if(dis[ cnt.to ]>dis[tmp]+cnt.w) { dis[ cnt.to ]=dis[tmp]+cnt.w; if(!vis[ cnt.to ]) { que.push(cnt.to); vis[ cnt.to ]=true; } } } }}int main(){ cin>>n>>m>>start>>e; for(int i=0;i<=n;i++) vec[i].clear(); for(int i=1;i<=m;i++) { edge cnt1,cnt2; int u,v,w; scanf("%d%d%d",&u,&v,&w); cnt1.to=u;cnt1.w=w; cnt2.to=v;cnt2.w=w; vec[u].push_back(cnt2); vec[v].push_back(cnt1); } SPFA(); cout<<dis[e]<<endl; return 0;}
0 0
- hihoCoder1081 1089 1093 :最短路径
- hihocoder 1089最短路径
- hihocoder1081
- hihoCoder#1089 最短路径·二
- #1089 : 最短路径·二
- 最短路径算法
- 最短路径算法
- 最短路径理解
- 最短路径算法
- 最短路径算法
- 最短路径问题
- 最短路径
- 最短路径
- 最短路径算法
- 图@ 最短路径
- 最短路径
- 最短路径算法
- 最短路径
- 黑马程序员----[20150428][面向对象3]
- 机器学习--线性回归 最小二乘法
- linux下java程序占用CPU和内存过高排错处理方案
- 从远古时代的黄页到大搜索时代的神灯——搜索引擎一路走来
- 配置Linux下的时间服务器,让一批机器和一台机器时间同步【设置一台专门用来同步时间的服务器名为timeserver,很实用】
- hihoCoder1081 1089 1093 :最短路径
- java对于汉字的首字母排序,遇到生僻字时,不要使用Collator.getInstance(java.util.Locale.CHINESE),而要用com.ibm.icu.util.ULocale
- windows下 Maven 安装
- Linux添加静态路由
- jquery moblie 初始化
- 《C++语言基础》参考——学生可以相加吗?
- C++字符串处理
- 一些不错的技术类网址汇总
- eclipse中的debug模式的使用