hdu–最短路徑問題–3790

來源:互聯網
上載者:User
最短路徑問題

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


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 21 2 5 62 3 4 51 30 0
 


Sample Output

9 11

 

 

#include <stdio.h>   #define INF 0x7fffffff   #define MAX 1002     struct node  {      int len,val;  }map[MAX][MAX];    int dist[MAX],visited[MAX],cost[MAX];    void Dijkstra(int s,int t,int n)  {      int i,j,min,u;      for (i=1;i<=n;i++)      {          dist[i]=map[s][i].len;          cost[i]=map[s][i].val;          visited[i]=0;      }      visited[s]=1;      dist[s]=0;      cost[s]=0;      for (i=1;i<n;i++)      {          min=INF;          u=i;          for(j=1;j<=n;j++)              if (!visited[j]&&dist[j]<min)              {                  min=dist[j];                  u=j;              }          visited[u]=1;          for(j=1;j<=n;j++)          {              if (!visited[j]&&map[u][j].len<INF)              {                  if(dist[j]>(map[u][j].len+dist[u]))                  {                      dist[j]=map[u][j].len+dist[u];                      cost[j]=map[u][j].val+cost[u];                  }                  else if(dist[j]==(map[u][j].len+dist[u]))                  {                      if(cost[j]>(map[u][j].val+cost[u]))                          cost[j]=map[u][j].val+cost[u];                  }              }//if           }//for       }//for       printf("%d %d\n",dist[t],cost[t]);  }    int main()  {      int n,m,i,j,d,p,s,t;      while(scanf("%d %d",&n,&m)&&n)      {          for (i=1;i<=n;i++)          {              for(j=1;j<=n;j++)              {                  map[i][j].len=INF;                  map[i][j].val=INF;              }          }          while(m--)          {              scanf("%d %d %d %d",&i,&j,&d,&p);              if(map[i][j].len>d)              {                  map[i][j].len=map[j][i].len=d;                  map[i][j].val=map[j][i].val=p;              }              else if(map[i][j].len==d)                  if(map[i][j].val>p)                      map[i][j].val=map[j][i].val=p;          }          scanf("%d %d",&s,&t);          Dijkstra(s,t,n);      }      return 0;  }  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.