HDOJ 最短路径问题

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 15296    Accepted Submission(s): 4629

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
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int map[2][1010][1010],vis[1010],dis[2][1010];
int n,m,s,t;
int getnext(){
    int i,u=-1,t=inf;
    int temp=inf;
    for(i=1;i<=n;++i){
        if(!vis[i]&&(dis[0][i]<temp||(dis[0][i]==temp&&dis[1][i]<t))){
            t=dis[1][i];temp=dis[0][i];
            u=i;
        }
    }
    return u;
}
void dijkstra(){
        int u=s,temp,i,j,k;
        memset(vis,0,sizeof(vis));
        while(u!=-1){
            for(i=1;i<=n;++i){
                temp=dis[0][u]+map[0][u][i];
                if(temp<dis[0][i]){
                    dis[0][i]=temp;
                    dis[1][i]=dis[1][u]+map[1][u][i];
                }
                else if(temp==dis[0][i]){
                    if(dis[1][u]+map[1][u][i]<dis[1][i]){
                        dis[1][i]=dis[1][u]+map[1][u][i];
                    }
                }
            }
            vis[u]=1;
            if(u==t){
                printf("%d %d\n",dis[0][t],dis[1][t]);
                break;
            }
            u=getnext();
        }
}
int main()
{
    int i,j,a,b,c,d;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n==0&&m==0)break;
        memset(dis,0x3f,sizeof(dis));
        memset(map,0x3f,sizeof(map));
            for(j=0;j<m;++j){
                scanf("%d%d%d%d",&a,&b,&c,&d);
                if(c<map[0][a][b]||(map[0][a][b]==c&&map[1][a][b]>d)){
                    map[0][a][b]=map[0][b][a]=c;
                    map[1][a][b]=map[1][b][a]=d;
                }
            }
        scanf("%d%d",&s,&t);
        dis[0][s]=dis[1][s]=0;
        dijkstra();
    }
    return 0;
}
时间: 2024-08-24 09:55:15

HDOJ 最短路径问题的相关文章

hdoj(3790) 最短路径

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13577    Accepted Submission(s): 4156 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

HDOJ 3790 最短路径问题 【双权值】

题意:... 难点:如何处理两个权值. 分析:题意说如果最短路径有多个,那么取价值最低的那个,所以说价值随着路径在变,如果路径不相等那么就更新路径并且更新价值,反之,则判断价值是不是要更新. 代码: #include<stdio.h> #include<string.h> #define M 1002 #define INF 0x3f3f3f3f int mapp[M][M], mapd[M][M], n, m, di[M], dp[M];//mapd是路径 mapp是价值 boo

HDOJ 3790 最短路径问题(dijkstra算法)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17968    Accepted Submission(s): 5385 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

hdoj 3790 最短路径问题

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17986    Accepted Submission(s): 5394 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费.假设最短距离有多条路线,则输出花费最少的. Input

畅通共续(2008浙大研究生复试热身赛[最短路径] hdoj 1874)

畅通工程续 点击打开链接 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 37269    Accepted Submission(s): 13759 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要

HDOJ 2544 最短路(最短路径 dijkstra算法)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 42716    Accepted Submission(s): 18715 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

【HDOJ】1874-畅通工程续(最短路径dijkstra)

1874-畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 题意:略. 思路:最短路dijkstra模板,不过要先要把题里输入的把两点间距离赋值给构建的矩阵. dijkstra算法 #include<bits/stdc++.h> using namespace std; #define inf 99999999 #define maxn 210 int maps[maxn][maxn], dis[maxn], visited[maxn];

hdoj 2544 最短路 【最短路径模板题】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33752    Accepted Submission(s): 14662 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

hdoj 1869 六度分离【最短路径求两两边之间最长边】

六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5443    Accepted Submission(s): 2208 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中