乘车路线

来源:互联网 发布:边缘融合软件 破解 编辑:程序博客网 时间:2024/04/29 03:04

D.乘车路线(roads.exe  1s )

编号为1.. N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost)。BOB准备从城镇1出发到达城镇N,但他目前只有W的钱,为此,你需要帮助他寻找一条从城镇1到城镇N在他能支付的前提下的一条最短路线。

 

输入:

     第一行为钱的数目W (0<=w<=1000)

     第二行为城镇数目N(2<=N<=100)

     第三行为为道路条数K(1<=K<=10000)

     随后的K行每行为一条道路的信息,包含4个数值(S,D,L,T)其中S为源城镇,D为目标城镇,L为道路长度,T为所需支付费用。(1<=S,D<=N,1<=L<=100,0<=T<=100)

 

输出

      输出最短长度,若无解,则输出“NO”;

 

示例:

roads.in

5

6

7

1 2 2 3

2 4 3 3

3 4 2 4

1 3 4 1

4 6 2 1

3 5 2 0

5 4 3 2

roads.out

11

#include<cstdio>
int w,n,k;
int e[105][105],m[105][105],e1[105],m1[105],book[105];
int main()
{
// freopen("roads.in","r",stdin);
// freopen("roads.out","w",stdout);
scanf("%d%d%d",&w,&n,&k);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i==j) e[i][j]=0,m[i][j]=0;else
e[i][j]=999999999,m[i][j]=999999999;
for (int i=1;i<=k;i++)
{
int t1,t2,t3,t4;
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
e[t1][t2]=t3;
m[t1][t2]=t4;
}
for (int i=1;i<=n;i++)
e1[i]=e[1][i],m1[i]=m[1][i];
book[1]=1;
for (int k=2;k<=n;k++)
{
int min=999999999;
int u;
for (int i=2;i<=n;i++)
if (book[i]==0)
{
if (e1[i]<min) 
{
min=e1[i];
u=i;
}
}
book[u]=1;
for (int i=1;i<=n;i++)
if (e[u][i]+e1[u]<e1[i])
{
if (m[u][i]+m1[u]<w)
{
e1[i]=e[u][i]+e1[u];
m1[i]=m[u][i]+m1[u];
}
}
}
if (e1[n]!=999999999) printf("%d\n",e1[n]);else
printf("NO\n");
return 0;
}

原创粉丝点击