时间限制: 2000ms 内存限制: 256MB
描述
有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?
输入
输入数据的第一行包含一个整数 T,表示数据组数。
接下来有 T 组数据,每组数据中:
第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。
接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。
接下来一行包含一个整数 M,表示询问数。
接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。
输出
对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。
接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
数据范围
1 ≤ T ≤ 5
小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000
大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
样例输入
2
5
1 2 5
1 3 20
2 4 30
4 5 15
2
3 4
3 5
5
1 4 32
2 3 100
3 5 45
4 5 60
2
1 4
1 3
样例输出
Case #1:
No
Yes
Case #2:
No
Yes
描述
有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?
输入
输入数据的第一行包含一个整数 T,表示数据组数。
接下来有 T 组数据,每组数据中:
第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。
接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。
接下来一行包含一个整数 M,表示询问数。
接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。
输出
对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。
接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
数据范围
1 ≤ T ≤ 5
小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000
大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
样例输入
2
5
1 2 5
1 3 20
2 4 30
4 5 15
2
3 4
3 5
5
1 4 32
2 3 100
3 5 45
4 5 60
2
1 4
1 3
样例输出
Case #1:
No
Yes
Case #2:
No
Yes
#include<string>
#include<memory.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
struct load{
int point;
load*next;
};
int shortload(int start,int matrix[][105],int point,load **load_path);
const int INF=10000000;
int visit[105];
int matrix[105][105];
int dis[105];
int path[105][105];
load * load_path[105];
int main()
{
int T,x;
cin>>T;
for(x=1;x<T+1;x++)
{
cout<<"Case #:"<<x<<endl;
int point,line,length;
int start_x,end_x;
int i,j,k,l;
cin>>point;
for( i=0;i<point;i++)
for( j=0;j<point;j++)
matrix[i][j]=INF;
for(i=0;i<point-1;i++)
{
int start,end;
cin>>start>>end>>length;
matrix[start-1][end-1]=matrix[end-1][start-1]=length;
}
int question;
cin>>question;
while(question--)
{
memset(path,0,105*105*sizeof(int ));
cin>>start_x>>end_x;
for( i=0;i<point;i++)
{
load_path[i]=(load*)malloc(sizeof(load));
load_path[i]->point=start_x-1;
load* p=(load*)malloc(sizeof(load));
p->point=i;
p->next=NULL;
load_path[i]->next=p;
}
shortload(start_x-1,matrix,point,load_path);
load* p=load_path[end_x-1];
i=0;
if(p)
{
while(p->next)
{
path[end_x-1][i]=matrix[p->point][p->next->point];
i++;
p=p->next;
}
}
int flag=0;
if(i<3)
cout<<"No"<<endl;
else
{
for(j=0;j<i-2;j++)
for( k=j+1;k<i-1;k++)
for(l=k+1;l<i;l++)
{
if((path[end_x-1][j]+path[end_x-1][k]>path[end_x-1][l])&&(path[end_x-1][j]-path[end_x-1][k]<path[end_x-1][l])
&&(path[end_x-1][j]+path[end_x-1][l]>path[end_x-1][k])&&(path[end_x-1][j]-path[end_x-1][l]<path[end_x-1][k])
&&(path[end_x-1][k]+path[end_x-1][l]>path[end_x-1][j])&&(path[end_x-1][k]-path[end_x-1][l]<path[end_x-1][j])
)
{
cout<<"Yes"<<endl;
flag=1;
k=i-1;
j=i-2;
break;
}
}
if(flag==0)
cout<<"No"<<endl;
}
}
}
}
int shortload(int start,int matrix[][105],int point,load ** load_path)
{
for(int i=0;i<point;i++)
{
dis[i]=matrix[start][i];
visit[i]=0;
}
visit[start]=1;
dis[start]=0;
int x=0;
for(int i=0;i<point;i++)
{
int min=INF;
for(int j=0;j<point;j++)
{
if(dis[j]<min&&visit[j]==0)
{
min=dis[j];
x=j;
}
}
visit[x]=1;
for(int j=0;j<point;j++)
if(visit[j]==0&&dis[x]+matrix[x][j]<dis[j])
{
load*p=load_path[x]->next;
while(p)
{
load* q=(load*)malloc(sizeof(load));
q->next=load_path[j]->next;
load_path[j]->next=q;
p=p->next;
}
p=load_path[x]->next;
load*q=load_path[j]->next;
while(p)
{
q->point=p->point;
p=p->next;
q=q->next;
}
dis[j]=dis[x]+matrix[x][j];
}
}
return 0;
}
使用RE,放弃了,反正资格赛只要一道题就可以了,交给大家去解决吧。
高手用Java写的,大数据应该也没有问题:
https://github.com/castorgmc/LeetCode/blob/master/src/problems/Main.java