首页 > 其他 > 详细

hdu 3790 最短路问题 (spfa练手)

时间:2019-02-13 00:53:24      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:路线   sam   main   names   hdu 3790   ostream   inpu   emp   \n   

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 <map>
#include <iostream>
#include<cstring>
#include<bits/stdc++.h>
#define ll long long int
#define M 6
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
struct node{ 
    int next;
    int to;
    int d,p;
};
node edge[200007];
int head[1007];
int cnt;
void add(int u,int v,int d,int p){
    edge[++cnt].next=head[u];
    edge[cnt].to=v;
    edge[cnt].d=d;
    edge[cnt].p=p;
    head[u]=cnt;
}
int n,m;
int s,e;
bool vis[1007];
int dis[1007],cost[1007];
void spfa(int x){
    for(int i=1;i<=n;i++){
        dis[i]=inf;
        cost[i]=inf;
    }
    dis[x]=cost[x]=0;
    memset(vis,0,sizeof(vis));
    queue<int > q;
    q.push(x);
    vis[x]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i!=0;i=edge[i].next){
            int to=edge[i].to; int d=edge[i].d; int p=edge[i].p;
            if(dis[to]>dis[u]+d||((dis[to]==dis[u]+d)&&(cost[to]>cost[u]+p))){
                cost[to]=cost[u]+p;
                dis[to]=dis[u]+d;
                if(!vis[to]){
                    q.push(to);
                    vis[to]=1;
                }
            }
        }
    }
        
}
int main(){
    //ios::sync_with_stdio(false);
    while(scanf("%d%d",&n,&m)!=EOF){
        if(!n&&!m) break;
        memset(head,0,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++){
            int a,b,d,p;
            scanf("%d%d%d%d",&a,&b,&d,&p);
            add(a,b,d,p);
            add(b,a,d,p);
        }
        scanf("%d%d",&s,&e);
        spfa(s);
        printf("%d %d\n",dis[e],cost[e]);
    }
}

 

 

hdu 3790 最短路问题 (spfa练手)

标签:路线   sam   main   names   hdu 3790   ostream   inpu   emp   \n   

原文:https://www.cnblogs.com/wmj6/p/10367660.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号