#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string.h>
#include<cmath>
#include<string>
using namespace std;
//
/*************************
题意:
有一个成环(图中仅这个环)的图,按顺序给出各点间的距离
给出查询s到e
求出s到e的最小值
*************************/
/************************
求解要点:
1.由于N>10^5,故不可能用DJktra,而且是简单题
2.根据这个图的特性, 2到5的距离可以表示为
1到5的距离减去1到2的距离
或
1到5的“反向距离”加上1到2的距离
即最短路只有两种可能,绕1过,或不绕1过,即可得答案
************************/
/***********************
笔记:
*********************/
#define M 100005
#define INF 0xfffff
int d[M];
int d1[M],d2[M]; //d1是顺时针,d2是逆时针
int main()
{
int n,i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&d[i]);
sum+=d[i];
}
d1[1]=0;
d2[1]=0;
for(i=2;i<=n;i++)
{
d1[i] = d1[i-1] + d[i-1];
d2[i] = sum - d1[i];
//printf("d1[%d]=%d,d2[%d]=%d\n",i,d1[i],i,d2[i]);
}
int k,s,e,dd1,dd2;
scanf("%d",&k);
int t;
for(i=0;i<k;i++)
{
scanf("%d%d",&s,&e);
if(s>e)
{
t=s;
s=e;
e=t;
}
dd1=d1[e]-d1[s];
dd2=d1[s]+d2[e];
if(dd1 < dd2)
cout<<dd1<<endl;
else cout<<dd2<<endl;
}
return 0;
}
1046. Shortest Distance (20) 单环图的求路径性质
原创
©著作权归作者所有:来自51CTO博客作者breakDawn的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【Phaser游戏开发】动画效果-舞动的蝴蝶环
舞动的蝴蝶圆环,蝴蝶群飞舞
Game Phaser 舞动的蝴蝶圆环 蝴蝶群飞舞 -
1046 Shortest Distance (20 分)
1046Shortest Distance(2
c++ sed #include -
PAT 甲级 1046 Shortest Distance
1046 Shortest Dist
PAT甲级 Shortest Distance 1046 #include ide