1438: [蓝桥杯][2013年第四届真题]大臣的旅费
菜鸟生成记(3)
这一题真是搞人心态,扣了一周,不是超时,就是爆栈;后来看到大神用邻接表数组和vector写的,想参考一下;看了一两天,愣是没看出个所以然(没学过STL,邻接表数组太绕了,脑子不好使T-T);
心态爆炸!最后去问数据结构老师,老师直接给我说了一通:“我没教过STL和邻接表数组,难道我没有教过邻接表吗?”;唉!裂开了,上课划水,还让老师知道了;没办法,找到以前的课件,开始恶补;弄懂了十之七八;直接照搬;还好AC;前几天"撕心裂肺",不过现在看来都是值得;爽!
说了一堆废话,上AC代码(下面还有超时和爆栈的代码)
#include<bits/stdc++.h>
using namespace std;
#define N 100000
typedef struct st{
int v;
int w;
struct st *nx;
}ll,*link;
struct sx{
ll *next;
}s[N];
int n;
int book[N]={0};
int str=0;
int max1=-1;
void dfs(int x,int k)
{
if(k>max1)
{
max1=k;
str=x;
}
link p;
p=s[x].next;
while(p)
{
if(book[p->v]==0)
{
book[p->v]=1;
dfs(p->v,k+p->w);
book[p->v]=0;
}
p=p->nx;
}
return;
}
int main()
{
int w,sum=0;
cin>>n;
link p;
int x,y;
for(int i=1;i<=n;i++)
{
s[i].next=0;
}
for(int i=1;i<=n-1;i++)
{
scanf("%d%d%d",&x,&y,&w);
int th=x;
p=new ll;
p->v=y;
p->w=w;
p->nx=s[th].next;
s[th].next=p;
th=y;
p=new ll;
p->v=x;
p->w=w;
p->nx=s[th].next;
s[th].next=p;
}
book[1]=1;
dfs(1,0);
memset(book,0,sizeof(book));
book[str]=1;
dfs(str,0);
sum=max1*10+max1*(max1+1)/2;
cout<<sum<<endl;
return 0;
}
超时80%代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e+5;
struct st{
int x;
int y;
int w;
}s[N];
int n,str=0,max1=-1;
int book[N]={0};
void dfs(int x,int k,int step)
{
if(k>max1)
{
max1=k;
str=x;
}
if(step==n)
{
return;
}
for(int i=1;i<=2*(n-1);i++)
{
int x1=s[i].x;
int y1=s[i].y;
int w1=s[i].w;
if(book[y1]==0&&x1==x)
{
book[y1]=1;
dfs(y1,k+w1,step+1);
book[y1]=0;
}
}
}
int main()
{
cin>>n;
int sum=0;
for(int i=1;i<=n-1;i++)
{
int x,y,w;
cin>>x>>y>>w;
s[i+n-1].y=s[i].x=x;
s[i+n-1].x=s[i].y=y;
s[i+n-1].w=s[i].w=w;
}
book[1]=1;
dfs(1,0,1);
max1=-1;
memset(book,0,sizeof(book));
book[str]=1;
dfs(str,0,1);
sum=max1*10+max1*(max1+1)/2;
cout<<sum<<endl;
return 0;
}
爆栈(内存超限)
#include<stdio.h>
#include<string.h>
#define N 10001
#define max(x,y) x>y?x:y
struct st{
int a;
int b;
int w;
}s[N];
int a[N][N];
int book[N];
int n;
int x,y,sum=0,max1=0;
fun(int x,int k)
{
if(k>sum)
{
sum=k;
}
for(int i=1;i<=n;i++)
{
if(a[x][i]!=0&&book[i]==0)
{
book[i]=1;
fun(i,k+a[x][i]);
book[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=0;i<n-1;i++)
{
scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].w);
x=s[i].a;
y=s[i].b;
a[x][y]=s[i].w;
a[y][x]=s[i].w;
}
for(int i=1;i<=n;i++)
{
sum=0;
book[i]=1;
fun(i,0);
book[i]=0;
max1=max(sum,max1);
}
sum=0;
sum=max1*10+max1*(max1+1)/2;
printf("%d",sum);
return 0;
}