NOIP2014联合权值

发现去年简直弱爆了,这么简单的一眼题都傻逼逼的不会做,NOIP快来了回去做一下这些简单题,然而边忘记开2倍N了然后70分无语了好久还以为是dfs栈爆了去写了bfs,算了算了

DFS:

#include
#include
#include
#define N 200005
#define inf 10007
#define LL long long
using namespace std;
struct edge
{
       int x,y,next;
}e[N*2];
LL w[N],sum[N],ls[N],cnt,faf[N],ma[N];
LL ans,anss;
int n;

void add(int x,int y)
{
     int t=++cnt;e[t].x=x;e[t].y=y;e[t].next=ls[x];ls[x]=t;
     t=++cnt;e[t].x=y;e[t].y=x;e[t].next=ls[y];ls[y]=t;
     }

void dfs(int x,int pre,int prep)
{
     if (prep>0) faf[x]=prep;
     sum[pre]+=w[x];
     if (!ma[pre]) ma[pre]=x;
     if (w[x]>w[ma[pre]]) ma[pre]=x;
     for (int i=ls[x];i!=0;i=e[i].next)
     {
         if (e[i].y!=pre) dfs(e[i].y,x,pre);
         }
     }
     
void work(int x,int pre)         
{
//     cout<
然后是BFS:

#include
#include
#include
#define N 200005
#define inf 10007
#define LL long long
using namespace std;
struct edge
{
       int x,y,next;
}e[N*2];
LL w[N],sum[N],ls[N],cnt,faf[N],ma[N];
LL ans,anss;
int n;

void add(LL x,LL y)
{
     int t=++cnt;e[t].x=x;e[t].y=y;e[t].next=ls[x];ls[x]=t;
     t=++cnt;e[t].x=y;e[t].y=x;e[t].next=ls[y];ls[y]=t;
     }

int q[N],pre[N],prep[N],h,t,v[N];
void bfs()
{
     h=0;t=1;q[t]=1;pre[t]=0;prep[t]=-1;memset(v,0,sizeof(v));v[1]=1;
     while (h0) faf[q[h]]=prep[h];
           sum[pre[h]]+=w[q[h]];
           if (!ma[pre[h]]) ma[pre[h]]=q[h];
           if (w[q[h]]>w[ma[pre[h]]]) ma[pre[h]]=q[h];
           for (int i=ls[q[h]];i!=0;i=e[i].next)
           {
               if (!v[e[i].y]) 
               {
                               q[++t]=e[i].y;
                               pre[t]=q[h];
                               prep[t]=pre[h];
                               v[e[i].y]=1;
                               }
               }
           }
     }
     
void work()
{
     h=0;t=1;q[t]=1;pre[t]=0;memset(v,0,sizeof(v));v[1]=1;
     while (h



你可能感兴趣的:(noip)