C

来源:互联网 发布:jquery 反序列化json 编辑:程序博客网 时间:2024/06/07 00:39
C - 最短路径问题
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status Practice HDU 3790
Appoint description: 

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<iostream>  #include<cstring>  #include<cstdio>  #define inf 0xfffffff  using namespace std;  #define size 1005  int s[size][size];  int c[size][size];    bool visit[size];    int dis[size];  int cost[size];  int n,m;  void djk(int b,int e)  {      int i,j,tab,temp;      memset(visit,0,sizeof(visit));      for(i=0;i<n;i++)          dis[i]=s[b][i],cost[i]=c[b][i];      dis[b]=0;      cost[b]=0;      visit[b]=1;      for(i=0;i<n;i++)      {          temp=inf;          for(j=0;j<n;j++)          {              if(!visit[j]&&dis[j]<temp)                  temp=dis[j],tab=j;          }          visit[tab]=1;          for(j=0;j<n;j++)          {              if(!visit[j]&&dis[j]>dis[tab]+s[tab][j])                  dis[j]=dis[tab]+s[tab][j],cost[j]=cost[tab]+c[tab][j];              else if(!visit[j]&&dis[j]==dis[tab]+s[tab][j]&&cost[j]>cost[tab]+c[tab][j])                  cost[j]=cost[tab]+c[tab][j];          }      }  //    cout<<dis[e]<<" "<<cost[e]<<endl;      printf("%d %d\n",dis[e],cost[e]);  }  int main()  {      int a,b,d,p,i,j,Start,End;      while(scanf("%d%d",&n,&m)!=EOF)      {          if(n==0&&m==0)              break;          for(i=0;i<n;i++)              for(j=0;j<n;j++)                  s[i][j]=inf,c[i][j]=inf;          for(i=0;i<m;i++)          {              //cin>>a>>b>>d>>p;              scanf("%d%d%d%d",&a,&b,&d,&p); a=a-1;b=b-1;             if(d<s[a][b])              {                  s[a][b]=s[b][a]=d;                  c[a][b]=c[b][a]=p;              }          }          cin>>Start>>End;          djk(Start-1,End-1);      }      return 0;  }  

原创粉丝点击