您的位置:首页 > 其它

07-图6 旅游规划 (25分)

2017-05-30 19:49 260 查看
07-图6 旅游规划   (25分)有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NN、MM、SS、DD,其中NN(2\leN\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1);MM是高速公路的条数;SS是出发地的城市编号;DD是目的地的城市编号。随后的MM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出样例:

3 40
这题在一个memset上面卡住了,在对两个数组初始化的时候用了memset结果一直出现一些莫名其妙的错误,后来用了最基础的初始化就好了。因为memset是对连续一段区间的处理,也找了些资料,并没有特别懂,但是感觉用在这个数组也不太合适。之后再去查查。直接给出代码。
#include<iostream>#include<cstdlib>#include<cstring>using namespace std;typedef struct graphnode *Graph;int s,d;struct graphnode{int Nv,Ne;int G[501][501];int P[501][501];};void Insert(Graph g,int x,int y,int w,int z){g->G[x][y]=w;g->G[y][x]=w;g->P[x][y]=z;g->P[y][x]=z;}Graph Create(){int m,n;cin>>n>>m>>s>>d;Graph g=(Graph)malloc(sizeof(struct graphnode));g->Nv=n;g->Ne=m;//	memset(g->G,65535,sizeof(g->G));//	memset(g->P,65535,sizeof(g->P));for(int i=0;i<n;i++){for(int j=0;j<n;j++){g->G[i][j]=65535;g->P[i][j]=65535;}}while(m--){int S,D,L,M;cin>>S>>D>>L>>M;Insert(g,S,D,L,M);}return g;}void Dijkstra(Graph g,int v0,int *D,int *PP){int flag[501],mm,i,j,k,mo;for(i=0;i<g->Nv;i++){flag[i]=0;D[i]=g->G[v0][i];PP[i]=g->P[v0][i];}D[v0]=0;flag[v0]=1;for(i=0;i<g->Nv;i++){mm=65535;for(j=0;j<g->Nv;j++){if(!flag[j])if(D[j]<mm){mm=D[j];mo=PP[j];k=j;}}if(mm<65535){flag[k]=1;}elsebreak;for(int p=0;p<g->Nv;p++){if(!flag[p]&&mm+g->G[k][p]<D[p]){D[p]=mm+g->G[k][p];PP[p]=mo+g->P[k][p];}elseif(!flag[p]&&mm+g->G[k][p]==D[p]&&mo+g->P[k][p]<PP[p]){PP[p]=mo+g->P[k][p];}}}}int main(){Graph g=Create();int c1[505],c2[505];Dijkstra(g,s,c1,c2);cout<<c1[d]<<" "<<c2[d]<<endl;return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: