您的位置:首页 > 其它

A1046 Shortest Distance 最短距离

2018-02-28 08:58 218 查看
思路:考虑到题目中的描述是一个无向环,故从一个结点到另一个结点只有两个方向,取其中小的即为最短距离
      虽然是图的背景,但根据输入发现并不适合用图的邻接矩阵或邻接表方式。
定义dis[i]表示1号节点到i号节点的下一个节点的距离。dis[0]=0;#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int main()
{
int dis[maxn],A[maxn];
int sum=0;
dis[0]=0;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
sum+=A[i];
dis[i]=sum;
}
int cnt,left,right;
scanf("%d",&cnt);
for(int i=0;i<cnt;i++)
{
scanf("%d %d",&left,&right);
if(left>right)
swap(left,right);
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int main()
{
int dis[maxn],A[maxn];
int sum=0;
dis[0]=0;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&A[i]);
sum+=A[i];
dis[i]=sum;
}
int cnt,left,right;
scanf("%d",&cnt);
for(int i=0;i<cnt;i++)
{
scanf("%d %d",&left,&right);
if(left>right)
swap(left,right);
int temp=dis[right-1]-dis[left-1];
printf("%d\n",min(temp,sum-temp));
}
return 0;
}
printf("%d\n",min(temp,sum-temp));
}
return 0;
}注意:
1,由于V5到V1不好表示,故left>right执行交换操作,确保始终沿着顺时针方向,另一边用sum减即可
2,关键:int temp=dis[right-1]-dis[left-1];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: