生活随笔
收集整理的這篇文章主要介紹了
题目 2055: 等待戈多(最短路)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
戈多是一個普通的小盆友,他居住在1城市。小x在k城等待戈多。
可惜戈多有點奇怪,在城市之間的道路上,他的速度有時快有時慢。
現在小x想知道,戈多最快到達的時間是多少?
輸入
第一行是兩個數字n(n<=500),k,表示城市的個數和小x的位置。
接下來是一個正整數的矩陣l,第i行第j列表示i到j的路徑長度。
接下來是一個正整數的矩陣v,表示戈多從i到j路徑所走的速度。
輸出
輸出一個浮點數,表示戈多最快到達的時間,保留兩位小數
樣例輸入
6 3
0 5 3 6 2 4
5 0 1 7 10 3
3 1 0 8 9 4
6 7 8 0 2 6
2 10 9 2 0 5
4 3 4 6 5 0
0 1 4 5 6 3
1 0 5 7 9 6
4 5 0 3 2 4
5 7 3 0 1 1
6 9 2 1 0 8
3 6 4 1 8 0
樣例輸出
0.75
思路:求1-k所需要的時間最小值。但是給定的是長度和速度,轉換一下就可以了。當練習一下最短路模板了。
代碼如下:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std
;const int maxx
=5e2+100;
const int maxm
=1e5+100;
struct edge
{int to
,next
;double val
;
}e
[maxm
<<1];
struct node
{int to
;double val
;node(int a
,double b
){to
=a
,val
=b
;}bool operator<(const node
&a
)const{return val
>a
.val
;}
};
int head
[maxm
<<1];
int a
[maxx
][maxx
],b
[maxx
][maxx
],vis
[maxx
];
double dis
[maxx
];
int n
,k
,tot
;inline void init()
{tot
=0;memset(head
,-1,sizeof(head
));
}
inline void add(int u
,int v
,double t
)
{e
[tot
].to
=v
,e
[tot
].next
=head
[u
],e
[tot
].val
=t
,head
[u
]=tot
++;
}
inline void Dijkstra()
{memset(vis
,0,sizeof(vis
));for(int i
=1;i
<=n
;i
++) dis
[i
]=1e9+10;dis
[1]=0.0;priority_queue
<node
> q
;q
.push(node(1,0.0));while(q
.size()){int u
=q
.top().to
;q
.pop();if(vis
[u
]) continue;if(u
==k
) break;vis
[u
]=1;for(int i
=head
[u
];i
!=-1;i
=e
[i
].next
){int to
=e
[i
].to
;double w
=e
[i
].val
;if(dis
[to
]>dis
[u
]+w
){dis
[to
]=dis
[u
]+w
;q
.push(node(to
,dis
[to
]));}}}printf("%.2lf\n",dis
[k
]);return ;
}
int main()
{scanf("%d%d",&n
,&k
);init();for(int i
=1;i
<=n
;i
++) for(int j
=1;j
<=n
;j
++) scanf("%d",&a
[i
][j
]);for(int i
=1;i
<=n
;i
++) for(int j
=1;j
<=n
;j
++) scanf("%d",&b
[i
][j
]);for(int i
=1;i
<=n
;i
++){for(int j
=1;j
<i
;j
++){add(i
,j
,((double)a
[i
][j
]/(double)b
[i
][j
]));add(j
,i
,((double)a
[i
][j
]/(double)b
[i
][j
]));}}Dijkstra();return 0;
}
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的题目 2055: 等待戈多(最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。