• hdu 3760 最短路径问题


    最近做的题感觉 测试数据很bt

    最短路径问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1714    Accepted Submission(s): 553


    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<iostream>
    #include<bitset>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define maxint 1000000000
    typedef struct Node
    {
     int v,len,cost;
    }Node;

    bitset<1001>bit[1001];
    queue<int>Q;
    vector<Node>p_link[1001];
    int dp[1005],dist[1005],vis[1005];
    int n,s,t;

    void Spfa(int k)
    {
     int i,v,u,len,cost;
     for(i=1;i<=n;i++) dist[i]=maxint,vis[i]=0,dp[i]=0;
     vis[k]=1,dist[k]=0,dp[k]=0;
     Q.push(k);
     while(!Q.empty())
     {
      u=Q.front(),Q.pop();
      vis[u]=0;
      for(i=0;i<p_link[u].size();i++)
      {
       v=p_link[u][i].v;
       len=p_link[u][i].len;
       cost=p_link[u][i].cost;
       if(dist[v]>dist[u]+len)
       {
        dist[v]=dist[u]+len;
        dp[v]=dp[u]+cost;
        if(!vis[v])
        {
         vis[v]=1; Q.push(v);
        }
       }
       else if(dist[v]==dist[u]+len&&dp[v]>dp[u]+cost)
       {
        dp[v]=dp[u]+cost;
       }
      }
     }
    }

    int main()
    {
        int i,m,x,y,len,cost;
     Node tmp;
     while(scanf("%d%d",&n,&m)==2)
     {
      if(n==0||m==0) break;
      memset(bit,0,sizeof(bit));
      for(i=1;i<=n;i++) p_link[i].clear();
      for(i=1;i<=m;i++)
      {
       scanf("%d%d%d%d",&x,&y,&len,&cost);
       if(bit[x][y]==0&&bit[y][x]==0)
       {
        tmp.v=y,tmp.len=len,tmp.cost=cost;
        p_link[x].push_back(tmp);
        tmp.v=x;
        p_link[y].push_back(tmp);
        bit[x][y]=bit[x][y]=1;
       }
       else////////有重边,还要判断
       {
        int j;
        for(j=0;j<p_link[x].size();j++)
         if(p_link[x][j].v==y&& p_link[x][j].len>len) { p_link[x][j].len=len; p_link[x][j].cost=cost; break;}
                    for(j=0;j<p_link[y].size();j++)
         if(p_link[y][j].v==x&& p_link[y][j].len>len) { p_link[y][j].len=len;p_link[y][j].cost=cost; break;}
       }
      }
      scanf("%d%d",&s,&t);
      Spfa(s);
      printf("%d %d\n",dist[t],dp[t]);
     }
     return 0;
    }
     

  • 相关阅读:
    ABP 菜单 修改
    C# 过滤器
    RabbitMQ框架构建系列(三)——Net实现RabbitMQ之Producer
    RabbitMQ系列(二)RabbitMQ基础介绍
    RabbitMQ系列(一)AMPQ协议
    MVC 解读WebConfig
    MVC过滤器特性
    asp.net中使用JQueryEasyUI
    asp.net请求到响应的整个过程
    Redis的下载安装部署(Windows)
  • 原文地址:https://www.cnblogs.com/forgood/p/2229309.html
Copyright © 2020-2023  润新知