HDU
来源:互联网 发布:河南安全教育网络平台 编辑:程序博客网 时间:2024/06/05 06:43
题目链接:https://vjudge.net/problem/HDU-2544
题意详见题目链接。
分析:很直白的一道题,就是求一个无向图的最短路径。多种方法都可以求。BFS,Dijkstra(迪杰斯特拉)算法,Floyd算法都可以求解。关于两种算法,可详见此链接。(写的很好,尤其是图做得好,一目了然,看一遍就知道这种算法的思路,强烈建议看一看)。
BFS版:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1e5+5;int num,n,m;int head[1005];struct Edge{ int from,to,val,next;}edge[maxn];void init(){ num=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int w){ Edge E={u,v,w,head[u]}; edge[num]=E; head[u]=num++;}queue<int> q;int dist[1005];void BFS(int st){ memset(dist,INF,sizeof(dist)); q.push(st); dist[1]=0; while(!q.empty()){ int u=q.front();q.pop(); for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(dist[v]>dist[u]+edge[i].val){ dist[v]=dist[u]+edge[i].val; q.push(v); } } }}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d%d",&n,&m)&&(n||m)){ init(); int a,b,c; for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); addedge(b,a,c);//用邻接表存储 } BFS(1); printf("%d\n",dist[n]); } return 0;}
Dijkstra版:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1e5+5;int mp[110][110],dist[110],vis[110];void Dijkstra(int n,int st){ for(int i=1;i<=n;i++) dist[i]=mp[1][i]; vis[st]=1; for(int i=1;i<=n;i++){ int p,_min=INF; for(int j=1;j<=n;j++){ if(!vis[j]&&dist[j]<_min){ p=j; _min=dist[j]; } } vis[p]=1; for(int j=1;j<=n;j++){ if(!vis[j]&&dist[p]+mp[p][j]<dist[j]){ dist[j]=dist[p]+mp[p][j]; } } }}int main() { //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)&&(n||m)){ memset(mp,INF,sizeof(mp)); memset(vis,0,sizeof(vis)); int a,b,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); mp[a][b]=mp[b][a]=c; } Dijkstra(n,1); printf("%d\n",dist[n]); } return 0;}
floyd 版:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1005;int dist[maxn][maxn];int main() { //freopen("in.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)&&(n||m)) { memset(dist,INF,sizeof(dist)); int a,b,c; for (int i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c); dist[b][a]=dist[a][b]=c; } for (int k=1; k<=n; k++) { for (int i=1; i<=n; i++) { for (int j=1; j<=n; j++) { dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]); } } } printf("%d\n",dist[1][n]); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- java原生序列化和Kryo(dubbo)序列化性能比较
- CODEVS 1011 数的计算 & 2001NOIP普及组T1
- 洛谷 P1944 最长括号匹配_NOI导刊2009提高(1)
- jsp九大类值对象四大作用域
- Spring与Hibernate整合(配置模式)
- HDU
- 树梅派 内存交换空间swap 更改
- 函数作用域链
- 数据结构与算法:图
- POJ 1696 Space Ant(凸包变形)
- Call to undefined function imagecreatefromjpeg()
- MOOC清华《面向对象程序设计》第7章:负载监视器的设计v2.0(采用基于模板的策略模式)
- zencart 批量删除无图片产品 优化网站
- Json 接收问题