HDOJ 3790 最短路径问题
2014-05-07 23:51
246 查看
有两个权值,距离相等的时候判断一下花费
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11075 Accepted Submission(s): 3348
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
Source
浙大计算机研究生复试上机考试-2010年
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1100;
const int INF=0x3f3f3f3f;
int c[maxn][maxn],w[maxn][maxn];
int n,m;
int origional,vis[maxn],dist[maxn],cost[maxn];
void dijkstra()
{
memset(vis,0,sizeof(vis));
memset(dist,63,sizeof(dist));
memset(cost,63,sizeof(cost));
cost[origional]=dist[origional]=0;
for(int l=0;l<n;l++)
{
int mark=-1,mindist=INF;
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
if(mindist>dist[i])
{
mark=i;
mindist=dist[i];
}
}
vis[mark]=1;
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
if(dist[i]>dist[mark]+w[mark][i])
{
dist[i]=dist[mark]+w[mark][i];
cost[i]=cost[mark]+c[mark][i];
}
else if(dist[i]==dist[mark]+w[mark][i]&&cost[i]>cost[mark]+c[mark][i])
{
cost[i]=cost[mark]+c[mark][i];
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(c,63,sizeof(c));
memset(w,63,sizeof(w));
int a,b,d,p;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(d<w[a][b])
{
c[a][b]=c[b][a]=p;
w[a][b]=w[b][a]=d;
}
}
int s,t;
scanf("%d%d",&s,&t);
origional=s;
dijkstra();
printf("%d %d\n",dist[t],cost[t]);
}
return 0;
}
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11075 Accepted Submission(s): 3348
Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
Source
浙大计算机研究生复试上机考试-2010年
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1100;
const int INF=0x3f3f3f3f;
int c[maxn][maxn],w[maxn][maxn];
int n,m;
int origional,vis[maxn],dist[maxn],cost[maxn];
void dijkstra()
{
memset(vis,0,sizeof(vis));
memset(dist,63,sizeof(dist));
memset(cost,63,sizeof(cost));
cost[origional]=dist[origional]=0;
for(int l=0;l<n;l++)
{
int mark=-1,mindist=INF;
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
if(mindist>dist[i])
{
mark=i;
mindist=dist[i];
}
}
vis[mark]=1;
for(int i=1;i<=n;i++)
{
if(vis[i]) continue;
if(dist[i]>dist[mark]+w[mark][i])
{
dist[i]=dist[mark]+w[mark][i];
cost[i]=cost[mark]+c[mark][i];
}
else if(dist[i]==dist[mark]+w[mark][i]&&cost[i]>cost[mark]+c[mark][i])
{
cost[i]=cost[mark]+c[mark][i];
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(c,63,sizeof(c));
memset(w,63,sizeof(w));
int a,b,d,p;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(d<w[a][b])
{
c[a][b]=c[b][a]=p;
w[a][b]=w[b][a]=d;
}
}
int s,t;
scanf("%d%d",&s,&t);
origional=s;
dijkstra();
printf("%d %d\n",dist[t],cost[t]);
}
return 0;
}
相关文章推荐
- HDOJ 3790 最短路径问题(双权值最短路)
- 九度OJ108 HDOJ3790:最短路径问题 迪杰斯特拉算法
- HDOJ 3790 最短路径问题
- hdoj3790_最短路径问题(最短路径)
- HDOJ 3790 最短路径问题 (最短路 && Dijkstra && 双权值)
- HDOJ 3790 最短路径问题 SPFA
- HDOJ-3790 最短路径问题
- hdoj 3790 最短路径问题
- HDOJ 3790 最短路径问题
- HDOJ 3790 最短路径问题(最短路的路径追踪)
- hdoj 3790 最短路径问题
- HDOJ---3790 最短路径问题[Dijkstra算法||SPFA]
- HDOJ 3790最短路径问题
- hdoj 3790 最短路径问题
- HDOJ-3790最短路径问题(Dijkstra)
- hdoj--3790--最短路径问题(双权值迪杰斯特拉)
- HDOJ 3790-最短路径问题
- HDOJ 3790 最短路径问题 【dijkstra】+【双权值】
- HDOJ题目3790最短路径问题(最短路径,Dijkstra双权值)
- HDOJ 3790 最短路径问题