题意:给出一个环和结点之间的距离,求任意两结点之间的最近距离。如图:
思路:令数组dis[i]表示1号结点逆时针至i号结点的距离,初始化dis[1]=0,其他值在输入是确定,即
dis[i] | 0 | 1 | 3 | 7 | 21 |
i | 1 | 2 | 3 | 4 | 5 |
这样,起点start和终点end之间逆时针方向的距离即为 d=abs(dis[end]-dis[start]) ,注意要加绝对值,不然,比如起点4到终点2的距离是dis[2]-dis[4]=-6,就为负了。同时用total记录环的总距离,起点start和终点end之间逆时针方向的距离即为 total-d 。对于任意两结点u,v之间的最短距离,就是其顺时针和逆时针距离最较小值。
代码:
#include#include #define MIN(x,y) (x)<(y)?(x):(y)const int N=100010;int dis[N]={ 0};int main(){ int n,d,total=0;//total表示总的距离 scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&d); total+=d; dis[i+1]=d+dis[i]; } int m,s,e; scanf("%d",&m); for(int i=0;i