注册 登录
考研论坛 返回首页

sleeping1346的个人空间 http://home.kaoyan.com/?2907038 [收藏] [复制] [分享] [RSS]

日志

hdu3790-----单源最短路径

已有 1880 次阅读2011-3-6 21:08 |个人分类:ACM摸索

这是去年的第四题,第一次做dij,而且还是变形,所以很纠结。
1.输入时要考虑重边情况。
2.另一道hdu1874就是dij,但是要注意判断自己到自己的情况。
3.记住需要哪些数组,循环的步骤和条件,今年很有可能再出这种题。

#include<stdio.h>
#include<string>
#define MAX 0x7fffffff

bool u[1002];
int g[1002][1002],ex[1002][1002];
int d[1002],p[1002];

int main()
{
    int n,m,i,k;
    int a,b,d1,p1,s,t;
    int min_d,min_p;
    while(scanf("%d%d",&n,&m),n||m)
    {
       memset(g,-1,sizeof(g));
       while(m--)
       {
          scanf("%d%d%d%d",&a,&b,&d1,&p1);
          if(g[a][b]==-1||g[a][b]>d1){g[a][b]=g[b][a]=d1;ex[a][b]=ex[b][a]=p1;}
          else if(g[a][b]==d1&&ex[a][b]>p1)ex[a][b]=ex[b][a]=p1;
       }
       scanf("%d%d",&s,&t);
       for(i=1;i<=n;i++){d[i]=g[s][i];p[i]=ex[s][i];u[i]=false;}
       u[s]=true;
       d[s]=p[s]=0;
       while(1)
       {
          min_d=min_p=MAX;
          k=s;
          for(i=1;i<=n;i++)
          {
            if(!u[i]&&d[i]>0)
            {
               if(d[i]<min_d){k=i;min_d=d[k];}
               else if(d[i]==min_d&&p[i]<min_p){k=i;min_p=p[k];}
            }
          }
          u[k]=true;
          if(k==t)break;
          for(i=1;i<=n;i++)
            if(!u[i]&&g[k][i]>0)
            {
               if(d[i]==-1||d[k]+g[k][i]<d[i]){d[i]=d[k]+g[k][i];p[i]=p[k]+ex[k][i];}
               else if(d[k]+g[k][i]==d[i]&&p[k]+ex[k][i]<p[i])p[i]=p[k]+ex[k][i];
            }
       }
       printf("%d %d\n",d[t],p[t]);
    }
    return 0;
}


路过

雷人

握手

鲜花

鸡蛋
收藏 分享邀请 分享到人人 举报

评论 (0 个评论)

关于我们|商务合作|小黑屋|手机版|联系我们|服务条款|隐私保护|帮学堂| 网站地图|院校地图|漏洞提交|考研帮

GMT+8, 2024-5-7 02:14 , Processed in 0.047418 second(s), Total 8, Slave 8(Usage:3M, Links:[2]1,1_1) queries , Memcache On.

Powered by Discuz!

© 2001-2017 考研 Inc.

返回顶部
× 关闭