您的位置:首页 > 其它

最短路径问题--比较综合的一道题

2016-08-09 21:15 253 查看
复习最短路径问题,发现杭电acm-3790这道题目比较典型,就练习了下。开始调试时一直报错,后来加了87-91行,竟然就accepted,可能还是题意没完全理解清楚吧。特地记录下来,代码如下:
#include
#define MAX 1001
#define INF 65535

typedef struct cost
{
int d;//距离
int p;//花费
}cost;
cost map[MAX][MAX];

void calculate(cost map[MAX][MAX],cost D[MAX],int P[MAX],int flag[MAX],int n,int s)
{
for(int i=1;iD[j].p)
{
continue;
}
}
D[j].d=min.d+map[k][j].d;
D[j].p=min.p+map[k][j].p;
P[j]=k;
}
}
}
}

int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))//输入n,m
{
if(n==0 && m==0)//退出
{
break;
}
int loop=m;

for(int i=0;i<=n;i++)//初始化数组
{
for(int j=0;j<=n;j++)
{
if(i==j)
{
map[i][j].d=0;
map[i][j].p=0;
map[j][i]=map[i][j];
continue;
}
map[i][j].d=INF;
map[i][j].p=INF;
map[j][i]=map[i][j];
}
}

int a,b,d,p,s,t;
while(loop--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(map[a][b].d>d)
{
map[a][b].d=d;
map[a][b].p=p;
map[b][a]=map[a][b];
}
else if(map[a][b].d==d)
{
if(map[a][b].p>p)
map[a][b].p=map[b][a].p=p;
}
}
scanf("%d%d",&s,&t);
int P[MAX],flag[MAX];//P-前一路径
cost D[MAX];//D-最小值
for(int i=0;i<=n;i++)
{
D[i].d=map[s][i].d;
D[i].p=map[s][i].p;
}
for(int i=0;i<=n;i++)
{
P[i]=s;
}
for(int i=0;i<=n;i++)
{
flag[i]=0;
}
flag[s]=1;

calculate(map,D,P,flag,n,s);
printf("%d %d\n",D[t].d,D[t].p);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: