HDU 3790 最短路径问题
来源:互联网 发布:网络赌钱游戏网站 编辑:程序博客网 时间:2024/06/03 23:45
最短路问题。
2个权值,长度和费用。
优先更新 长度与费用。
长度相等 再更新费用。
开始用SFPA 结果更新费用搞错了,就用了Dijkstra。然后AC了又回头改,SPFA也AC了。
SPFA :
#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<iostream>#define INF 0xfffffffusing namespace std;int n,m;bool vis[1001];int dis[1001],cost[1001];struct lx{ int v,d,p;};vector<lx>g[1001];void SPFA(int start,int thend){ for(int i=1;i<=n;i++) { dis[i]=cost[i]=INF; vis[i]=0; } queue<int>q; vis[start]=1,dis[start]=0,cost[start]=0; q.push(start); while(!q.empty()) { int u=q.front();q.pop(); vis[u]=0; for(int j=0;j<g[u].size();j++) { int v=g[u][j].v; int d=g[u][j].d; int p=g[u][j].p; if(dis[v]>dis[u]+d) { dis[v]=dis[u]+d; cost[v]=cost[u]+p; if(!vis[v]) { vis[v]=1; q.push(v); } } else if(dis[v]==dis[u]+d) { if(cost[v]>cost[u]+p) cost[v]=cost[u]+p; } } } printf("%d %d\n",dis[thend],cost[thend]);}int main(){ while(scanf("%d%d",&n,&m),n&&m) { for(int i=1;i<=n;i++) g[i].clear(); while(m--) { int u,v,d,p; scanf("%d%d%d%d",&u,&v,&d,&p); lx now; now.d=d,now.p=p; now.v=v,g[u].push_back(now); now.v=u,g[v].push_back(now); } int start,thend; scanf("%d%d",&start,&thend); SPFA(start,thend); }}
Dijkstra
#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<iostream>#define INF 0xfffffffusing namespace std;int n,m;struct lx{ int v,d,p;};vector<lx>g[1001];void Dijkstra(int start,int thend){ int dis[1001],cost[1001]; bool vis[1001]; for(int i=1;i<=n;i++) dis[i]=cost[i]=INF,vis[i]=0; dis[start]=0; cost[start]=0; for(int i=1;i<=n;i++) { int mi=INF,u=start; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<mi) mi=dis[j],u=j; } vis[u]=1; for(int j=0;j<g[u].size();j++) { int v=g[u][j].v; int d=g[u][j].d; int p=g[u][j].p; if(!vis[v]) { if(dis[u]+d<dis[v]) { dis[v]=dis[u]+d;cost[v]=cost[u]+p; } else if(dis[u]+d==dis[v]) { if(cost[v]>cost[u]+p) cost[v]=cost[u]+p; } } } } printf("%d %d\n",dis[thend],cost[thend]);}int main(){ while(scanf("%d%d",&n,&m),n||m) { for(int i=1; i<=n; i++) g[i].clear(); while(m--) { int u,v,d,p; scanf("%d%d%d%d",&u,&v,&d,&p); lx now; now.d=d,now.p=p; now.v=u,g[v].push_back(now); now.v=v,g[u].push_back(now); } int start,thend; scanf("%d%d",&start,&thend); Dijkstra(start,thend); }}
0 0
- 【最短路径-Dis】hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU-3790-最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- Hdu 3790 最短路径问题
- HDU 3790 最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- 最短路径问题 hdu 3790
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu--最短路径问题--3790
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题 (SPFA)
- HDU1358 Period
- 串口操作之刷清输入输出缓存操作---tcflush()函数
- 二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland
- XFire开发客户端几种方式的示例
- 安卓学习日志之activity横竖屏切换的生命周期
- HDU 3790 最短路径问题
- 对C#和C++0x中Lamda表达式的简略对比--lsp
- Hibernate 中文乱码
- win8安装oracle 11g 报错 要求的结果: 5.0,5.1,5.2,6.0 6.1 之一 实际结果: 6.2
- 博客流量分析
- cocos2d-x学习之菜单与事件,消息触发机制
- 编译android 的srtp android.mk
- 做一个简易计算器
- jQuery选择器总结