这是比赛的问题陈述:http://www.codechef.com/OCT14/problems/TRIPS
P.S。:我看过社论,但想知道我的解决方案有什么问题。
这是Bytelandian学校的新趋势。 " Byteland旅游局"为高中生开发了一个新项目。该项目是所谓的“儿童旅行”#34;。
该项目本身非常简单:Byteland有一些旅游路线, N个旅游校园(编号从1到N)。为了经济起见,它们之间恰好有N-1道路。当然,即使有这个,也可以从任何旅游校园旅行到任何其他旅游校园。此外,为了安全起见,每条道路不超过2公里
当一个学生想要旅行时,他首先选择他的起始校园 - 他被直升机送到那里(比方说)。他也选择了他最终的目的地校园。从他的最终目的地,他将再次乘直升机(例如)直接送往他家。这样学生就不会徒步旅行任何额外的距离。当选择开始和结束并且交付瞳孔时,他开始他的唯一路线移动。没有一个学生是无限强大的,所以首先学生看着旅游路线的地图,然后他选择了他在当天可以到达的最远的校园(根据安全规定,严禁睡不着在校园,因为狼人会有一点麻烦,并在那里移动。然后新的一天开始,它重复到目的地到达的那一刻
当然,并非所有学生都是平等的。有人擅长数学,有人用英语,有人在体育。因此,所有高中生都有不同的优势,这很自然。
我们称力量是学生一天可以通过的最大公里数。现在,您已经收到了孩子们的大量疑问。对于每个查询,您将获得起始校园,最终校园和实力。您需要计算每次旅行的天数。校园地图和它们之间的距离也会给你
输入
第一行输入包含整数N,表示校园的数量
接下来的N-1线包含X Y D形式的三元组,意思是在第X和第Y个校园之间有一条道路,长度为D千米。
然后有一个带有单个整数M的行,表示查询的数量
然后,有M行具有S F P形式的三元组,其意思是行程从校园S开始,在校园F结束,学生具有P的强度。
输出
对于每个查询,请在单独的行中输出天数。
约束
1≤N,M≤100000
1≤X,Y,S,F≤N
1≤D≤2
2≤P≤2* N
例如
输入:
5
1 2 1
2 3 2
1 4 2
4 5 1
5
1 5 3
1 3 2
2 5 4
1 2 10
4 5 2
输出:
1
2
1
1
1
我使用的逻辑:
因为边数是n-1和n个顶点因此将有n-2个顶点,其中2度和2个顶点具有1度(这将是两个端点)。我做的是我创建了4个大小的数组n,其中两个将存储来自该顶点的下一个顶点的值,另外两个将把权重存储在该顶点的边缘上。现在我将发现起始和结束顶点,因为它们通过使用输入只有1级。一旦我得到起点,我将遍历它到存储下一个顶点和边缘权重的终点的唯一路径。现在每当我得到查询时,我只是将数据路径存储在数组中,现在我只是遍历数组并且得到我的结果
我的代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n],weighta[n],b[n],weightb[n],i,j,k,x,y,d,count,previousj;
//initialize
for (i = 0; i < n; ++i)
{
a[i]=-1;b[i]=-1;weighta[i]=-1,weightb[i]=-1;
}
for(i=0;i<n-1;i++)
{
scanf("%d%d%d",&x,&y,&d);
if(a[x-1]==-1)
{
a[x-1]=y-1;
weighta[x-1]=d;
}
else
{
b[x-1]=y-1;
weightb[x-1]=d;
}
if(a[y-1]==-1)
{
a[y-1]=x-1;
weighta[y-1]=d;
}
else
{
b[y-1]=x-1;
weightb[y-1]=d;
}
}
/*for (i = 0; i < n; ++i)
{
printf("a[i] %d weighta[i] %d b[i]%d weightb[i] %d\n",a[i],weighta[i],b[i],weightb[i]);
}*/
for(i=0;i<n;i++)
{
if(b[i]==-1)
break;
}
//printf("first end %d %d\n",i,a[i] );
int finalval[n],finalweight[n];
for (k = 0; k < n; ++k)
{
finalval[k]=0;finalweight[k]=0;
}
j=i;count=0;
finalval[count]=j;
finalweight[count]=weighta[j];
previousj=j;
j=a[j];
//printf("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
count++;
//printf("%s\n","HI" );
while(b[j]!=-1)
{ //printf("%d\n",b[j] );
//finalval[count]=j;
//finalweight[count]=weighta[j];
if(a[j]!=previousj)
{
finalval[count]=j;
finalweight[count]=weighta[j];
previousj=j;
j=a[j];
//printf("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
count++;
}
else
{
finalval[count]=j;
finalweight[count]=weightb[j];
previousj=j;
j=b[j];
//("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
count++;
}
}
finalval[count]=j;
finalweight[count]=finalweight[count];
count++;
/*
for (i = 0; i < n; ++i)
{
printf("final %d %d\n",i,finalval[i] );
}*/
int m;
scanf("%d",&m);
while(m--)
{ int s,f,p,flag=0,pos_s,pos_f;
scanf("%d%d%d",&s,&f,&p);
s--;f--;
for (i = 0; i <count; ++i)
{
if(finalval[i]==s)
{
pos_s=i;
if(flag==1)
break;
flag=1;
}
if(finalval[i]==f)
{
pos_f=i;
if(flag==1)
break;
flag=1;
}
}
int temp,days;
//("pos_s %d pos_f %d\n",pos_s,pos_f);
if(pos_s<pos_f)
{ //printf("%s\n","hi" );
temp=p;days=1;
for(i=pos_s;i<pos_f;i++)
{
if(temp>finalweight[i])
temp-=finalweight[i];
else if(temp==finalweight[i])
{
//days++;
temp=0;
}
else
{
days++;
temp=p;
temp-=finalweight[i];
}
}
//if(temp==p)
// days--;
}
else if(pos_s==pos_f)
days=1;
else
{ temp=p;days=1;
for(i=pos_s-1;i>=pos_f;i--)
{
if(temp>finalweight[i])
temp-=finalweight[i];
else if(temp==finalweight[i])
{
//days++;
temp=0;
}
else
{
days++;
temp=p;
temp-=finalweight[i];
}
}
//if(temp==p)
// days--;
}
printf("%d\n",days);
}
return 0;
}
答案 0 :(得分:0)
以下网络怎么样?
1
|
2-3-4
4分,3分......