• hdoj 1874最短路之最短路径问题


    最短路径问题

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


    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
     
    Recommend
    notonlysuccess
     
     
    这次又是因为没判重边 贡献了两次WA  又被坑了 
    这次绝对是教训啊  我错了
    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace  std;
     4 const int MAXINT =1<<29;
     5 #define Max 1005 
     6 struct pp
     7 {
     8     int lenth,cost;
     9 }f[Max][Max];
    10 int s[Max],dist[Max];
    11 int n,v;
    12 int flag[Max];
    13 
    14 void dj()
    15 {
    16     int i;
    17     for(i=1;i<=n;i++)
    18     {
    19         s[i]=0;
    20         dist[i]=f[v][i].lenth;
    21         flag[i]=f[v][i].cost;
    22     }
    23     s[v]=1;
    24     dist[v]=0;
    25     int min,u,j;
    26     for(i=1;i<=n;i++)
    27     {
    28         min=MAXINT;
    29         u=v;
    30         for(j=1;j<=n;j++)
    31             if(!s[j]&&min>dist[j])  min=dist[u=j];
    32             s[u]=1;
    33             for(j=1;j<=n;j++)
    34             {
    35                 if(!s[j]&&dist[u]+f[u][j].lenth<dist[j])
    36                 {
    37                 dist[j]=dist[u]+f[u][j].lenth;
    38                 flag[j]=flag[u]+f[u][j].cost;
    39                 }
    40                 else 
    41                     if(!s[j]&&dist[u]+f[u][j].lenth==dist[j]&&flag[u]+f[u][j].cost<flag[j])
    42                     flag[j]=flag[u]+f[u][j].cost;
    43             }
    44     }
    45 }
    46 
    47 int main()
    48 {
    49     int m;
    50     int a,b,d,p,star,end,i,j;
    51     while(cin>>n>>m,m+n)
    52     {
    53         for(i=1;i<=n;i++)
    54         {
    55             for(j=1;j<=n;j++)
    56                 f[i][j].lenth=MAXINT;
    57             flag[i]=0;
    58         }
    59             for (i=0;i<m;i++)
    60             {
    61                 scanf("%d%d%d%d",&a,&b,&d,&p);
    62                 if (f[a][b].lenth>d)
    63                 {//判重边  又一次被坑了
    64                     f[a][b].lenth= f[b][a].lenth=d;
    65                      f[a][b].cost=f[b][a].cost=p;
    66                 }
    67             
    68             }
    69             cin>>v>>end;
    70             dj();            
    71             cout<<dist[end]<<" "<<flag[end]<<endl;
    72     }
    73     
    74     return 0;
    75 }
  • 相关阅读:
    MyGeneration的NHibernate代码生成模版
    ASP.NET页面控制回车触发按钮
    操作NHibernate进行多事务并发处理的一些小经验
    mysql之sql_mode =only_full_group_by 设置问题
    1、一维数组排序
    使用正则表达式构造定制的HTML5输入框
    JavaScript加密库CryptoJS的使用
    安全密码存储,该怎么做,不该怎么做?
    google 站内搜索
    导入导出xls数据
  • 原文地址:https://www.cnblogs.com/wujianwei/p/2588810.html
Copyright © 2020-2023  润新知