首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求代码,该怎么解决

2012-04-08 
求代码题目描述:给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距

求代码
题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11


最好是c++,关键之处给注释,谢谢

[解决办法]

C/C++ code
//HDU 3970#include <iostream>#define MAX 1000001#define LEN 1009int distD[LEN];int distP[LEN];int mapD[LEN][LEN];//路程int mapP[LEN][LEN];//花费bool visited[LEN];//标记某点是否被访问 using namespace std; //初始化void init(){       int i,j;       for(i=0;i<LEN;i++){              for(j=0;j<LEN;j++){                     mapD[i][j]=MAX;                     mapP[i][j]=MAX;              }       }} //dijstra方法  n:多少个点 start:从某点开始void dijstra(int n,int start){        int i,j,min,k;       for(i=1;i<=n;i++){              visited[i]=false;              distD[i]=mapD[start][i];              distP[i]=mapP[start][i];       }        visited[start]=true;       distD[start]=0;        for(i=1;i<=n;i++){              min=MAX;              for(j=1;j<=n;j++){                     if(!visited[j] && distD[j]<min){                            min=distD[j];                            k=j;                     }              }              if(min==MAX) break;              visited[k]=true;              //只需要考虑距离就可以了              for(j=1;j<=n;j++){                     if(!visited[j]){                            if(distD[j]>distD[k]+mapD[k][j]){                                   distD[j]=distD[k]+mapD[k][j];                                   distP[j]=distP[k]+mapP[k][j];                            }                            else if(distD[j]==distD[k]+mapD[k][j]){//如果路径相同                                   if(distP[j]>distP[k]+mapP[k][j]){                                          distP[j]=distP[k]+mapP[k][j];                                   }                            }                                                 }               }       }} int main(){       int n,m;       while(cin>>n>>m){//输入点和边              if(n==0&&m==0) break;              init();              int i,j,a,b,d,p,s,t;              for(i=0;i<m;i++){                     cin>>a>>b>>d>>p;//输入各边的路径的花费                     if(mapD[a][b]>d){                            mapD[a][b]=mapD[b][a]=d;                            mapP[a][b]=mapP[b][a]=p;                     }              }              cin>>s>>t;//输入起始点和目标点              dijstra(n,s);              cout<<distD[t]<<" "<<distP[t]<<endl;            }       return 0;}&nbsp; 

热点排行