zoukankan      html  css  js  c++  java
  • 九度OJ 1008最短路径问题

    题目1008:最短路径问题

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:3219

    解决:963

    题目描述:
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
    输入:
    输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
    (1<n<=1000, 0<m<100000, s != t)
    输出:
    输出 一行有两个数, 最短距离及其花费。
    样例输入:
    3 2
    1 2 5 6
    2 3 4 5
    1 3
    0 0
    样例输出:
    9 11
    来源:
    2010年浙江大学计算机及软件工程研究生机试真题

    MYCode:

     

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    #define MAX 1010
    #define inf 100000000
    struct node
    {
        
    int dt;
        
    int ct;
        
    int id;
        
    bool operator<(node t)const
        {
            
    if(dt != t.dt)
                
    return dt > t.dt;
            
    return ct > t.ct;
        }
    };
    priority_queue<node> q;
    struct edge
    {
        
    int v;
        
    int w;
        
    int c;
        
    int next;
    } E[
    2 * 100010];
    int head[MAX];
    int num;
    int dist[MAX];
    int cost[MAX];
    bool vis[MAX];
    int n;
    int src, des;
    void init()
    {
        memset(head, -
    1sizeof(head));
        num = 
    0;
        
    int i;
        
    for(i = 1; i <= n; i++)
        {
            dist[i] = inf;
            cost[i] = inf;
        }
        memset(vis, 
    0sizeof(vis));
    }
    void add(int s, int t, int w, int c)
    {
        E[num].v = t;
        E[num].w = w;
        E[num].c = c;
        E[num].next = head[s];
        head[s] = num++;
        E[num].v = s;
        E[num].w = w;
        E[num].next = head[t];
        E[num].c = c;
        head[t] = num++;
    }
    void dijkstra()
    {
        
    while(!q.empty())q.pop();
        dist[src] = 
    0;
        cost[src] = 
    0;
        node bg;
        bg.dt = 
    0;
        bg.ct = 
    0;
        bg.id = src;
        q.push(bg);
        
    while(!q.empty())
        {
            node p = q.top();
            q.pop();
            
    int u = p.id;
            
    if(vis[u])continue;
            vis[u] = 
    true;
            
    int v;
            
    for(int i = head[u]; i != -1; i = E[i].next)
            {
                
    int v = E[i].v;
                
    //cout<<"show"<<u<<" "<<E[i].v<<" "<<E[i].w<<" "<<E[i].c<<endl;
                //cout<<dist[v]<<" "<<dist[u]+E[i].w<<" "<<cost[v]<<" "<<cost[u]+E[i].c<<endl;
                if((dist[v] > dist[u] + E[i].w) || (dist[v] == dist[u] + E[i].w && cost[v] > cost[u] + E[i].c))
                {
                    dist[v] = dist[u] + E[i].w;
                    cost[v] = cost[u] + E[i].c;
                    
    //cout<<"change "<<dist[v]<<" "<<cost[v]<<endl;
                    node tp;
                    tp.id = v;
                    tp.dt = dist[v];
                    tp.ct = cost[v];
                    q.push(tp);
                }
            }
        }
    }
    int main()
    {
        
    int m;
        
    while(scanf("%d%d", &n, &m) != EOF)
        {
            
    if(n == 0 && m == 0)
                
    break;
            init();
            
    int i;
            
    int s, t, w, c;
            
    for(i = 1; i <= m; i++)
            {
                scanf(
    "%d%d%d%d", &s, &t, &w, &c);
                add(s, t, w, c);
                add(t, s, w, c);
            }
            scanf(
    "%d%d", &src, &des);
            dijkstra();
            cout << dist[des] << 
    " " << cost[des] << endl;
        }
    }

    在最短路的基础上稍作修改。

  • 相关阅读:
    MyEclipse 2014 破解图文详细教程
    Eclipse构建Maven项目
    Eclipse构建Maven项目
    Spring--环境配置
    Spring--环境配置
    Sencha Touch2 -- 11.1:定义具有关联关系的模型
    Sencha Touch2 -- 11.1:定义具有关联关系的模型
    Android百度定位API的使用
    Android百度定位API的使用
    Java基础学习总结(64)——Java内存管理
  • 原文地址:https://www.cnblogs.com/java20130725/p/3215832.html
Copyright © 2011-2022 走看看