HDU 3790 最短路径问题(SPFA || Dijkstra )
题意 : 中文题不详述。
思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次。
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
const int INF = << ; using namespace std; int n, m,s,t;
int cost[][] ,mapp[][];
int dist[],cost1[] ;
int vis[] ; void spfa(int src)
{
queue<int> Q ;
memset(vis,,sizeof(vis)) ;
for(int i = ; i <= n ; i++)
{
dist[i] = INF ;
cost1[i] = INF ;
}
dist[src] = ;
vis[src] = ;
cost1[src] = ;
Q.push(src) ;
while(!Q.empty())
{
int u = Q.front() ;
Q.pop() ;
vis[u] = ;
for(int i = ; i <= n ; i++)
{ if(dist[i] > dist[u] + mapp[u][i])
{
dist[i] = dist[u] + mapp[u][i] ;
cost1[i] = cost1[u] + cost[u][i] ;
if(!vis[i])
{
vis[i] = ;
Q.push(i) ;
}
}
else if(dist[i] == dist[u]+mapp[u][i])
{
if(cost1[i] > cost1[u] + cost[u][i])
{
cost1[i]=cost1[u] + cost[u][i];
if(!vis[i])
{
vis[i] = ;
Q.push(i) ;
}
} }
}
}
}
void Init()
{
for(int i = ; i <= n ; i++)
for(int j = ; j <= n ; j++)
{
if(i == j) mapp[i][j] = cost[i][j] = ;
else mapp[i][j] = cost[i][j] = INF ;
}
}
int main()
{
//
while(cin >> n >> m)
{
if(n == && m == ) break ;
int a, b , d , p ;
Init() ;
for(int i = ; i < m ; i++)
{
cin >> a >> b >> d >> p ;
if(mapp[a][b] > d)
{
mapp[a][b] = mapp[b][a] = d ;
cost[a][b] = cost[b][a] = p ;
}
else if(mapp[a][b] == d&&cost[a][b] > p)
cost[a][b] = cost[b][a] = p ;
}
cin >> s >> t ;
spfa(s) ;
printf("%d %d\n",dist[t],cost1[t]) ;
}
return ;
}
会神的Dijkstra
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 1001
using namespace std;
const int inf=<<; int g[maxn][maxn];
int cost[maxn][maxn];
int n,m,a,b,d,p,s,e;
bool vis[maxn];
int dis[maxn],c[maxn]; void inti()
{
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
{
if(i==j)
{
g[i][j]=;
cost[i][j]=;
}
else
{
g[i][j]=inf;
cost[i][j]=inf;
}
}
}
} void dijkstra(int str)
{
memset(vis,false,sizeof(vis));
for(int i=; i<=n; i++)
{
dis[i]=g[str][i];
c[i]=cost[str][i];
}
dis[str]=;
c[str]=; vis[str]=true;
for(int i=; i<n; i++)
{
int m=inf,x;
for(int y=; y<=n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y];
vis[x]=true;
for(int y=; y<=n; y++)
{
if(!vis[y]&&g[x][y]!=inf)
{
if(dis[y]>dis[x]+g[x][y])
{
dis[y]=dis[x]+g[x][y];
c[y]=c[x]+cost[x][y];
}
else if(dis[y]==dis[x]+g[x][y])
{
if(c[y]>c[x]+cost[x][y])
c[y]=c[x]+cost[x][y];
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==) break;
inti();
for(int i=; i<m; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(d<g[a][b])
{
g[a][b]=g[b][a]=d;
cost[a][b]=cost[b][a]=p;
} }
scanf("%d%d",&s,&e);
dijkstra(s);
printf("%d %d\n",dis[e],c[e]);
}
return ;
}
HDU 3790 最短路径问题(SPFA || Dijkstra )的更多相关文章
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 3790 最短路径问题【Dijkstra】
题意:给出n个点,m条边,每条边的长度d和花费p,给出起点和终点的最短距离和花费,求最短距离,如果有多个最短距离,输出花费最少的 在用dijkstra求最短距离的时候,再用一个f[]数组保存下最少花费 ...
- HDU 3790 最短路径问题 (SPFA)
转载请注明出处:http://blog.csdn.net/a1dark 分析:比一般最短路多了一个花费.多加一个判断即可.用的SPFA.这道题让我搞清楚了以前定义INF为啥爆的问题.受益颇多. #in ...
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径dijkstra(多重权值)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
随机推荐
- 安装Oracle11g时,检测到系统的主 IP 地址是 DHCP 分配的地址
检查完成.此次检查的总体结果为: 失败 <<<< 问题: 安装检测到系统的主 IP 地址是 DHCP 分配的地址. 建议案: Oracle 支持在具有 DHCP 分配的 IP ...
- Android HTTP session && cookie
HTTP协议与状态保持HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是 ...
- [IOS] Storyboard全解析-第一部分
(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这 ...
- Python实现NN(神经网络)
Python实现NN(神经网络) 参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch 运行环境 Pyhton3 numpy(科学计算 ...
- Labview实现脉波调制( PPM )
Labview实现脉波调制( PPM ) 根据定义为脉冲宽度调制 生成一个正弦信号,得到其幅值输入给一个方波信号的偏移量 由于方波信号的偏移量里面含有正弦信号的信息 因此通过对方波信号的上升沿或下降沿 ...
- 数据库的编码浅谈(ZHS16GBK与US7ASCII)
数据库的编码浅谈(ZHS16GBK与US7ASCII) 2007-11-15 17:14:18 分类: Oracle SQL> SELECT RAWTOHEX('郭A军') from dual ...
- Android L Camera2 API 使用实例程序汇总
在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考: 1.Camera2 Basic : https://github.com/googlesamples/android-C ...
- java中直接打印对象
java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...
- go对json的解析处理
json常用函数 func Marshal(v interface{}) ([]byte, error) //将各种数据类型转化为json数据类型 func Unmarshal (data []byt ...
- nodejs笔记二--文件I/O;
一.写入文件: fs.writeFile(filename, data, callback),数据参数可以是string或者是Buffer,编码格式参数可选,默认为"utf8",回 ...