SPFA+DP&&http://acm.nyist.net/JudgeOnline/problem.php?pid=203

这几天忙着复习也没顾得刷题,,罪过啊,,O(∩_∩)O~

这一题是一道小综合题,最短路和0—1背包结合,,调试了好大一会,,纠结,,感觉自己弱爆了,,

 #include<iostream>
 #include<algorithm>
 #include<cstdio>
 #include<string.h>
 #define N 101
 #define M   0x3f
 #include<queue>
 using namespace std;
 typedef struct { int to,len,next;
         }Node;
 Node node[1000*N];
 int dist[N],head[N],cost[N],result[10000*N];
 bool visit[N];
 int num,s,n,m;
  void init()
  { num=0;
    memset(head,-1,sizeof(head));
    memset(result,0,sizeof(result));
     memset(dist,M,sizeof(dist));//有时候这样初始化不正确
     /* 这样写保险,,,, for(int i=0;i<=n;++i)
                            dist[i]=M;*/ 
       
  }
  void Add(int a,int b,int c)
  {  node[num].len=c;
     node[num].to= b;
     node[num].next=head[a];
     head[a]=num++;
  }
  void SPFA()
  {   dist[0]=0;
      memset(visit,false,sizeof(visit));
      queue<int> Q;
      Q.push(0);
      visit[0]=true;
      while(!Q.empty())
      {  int u=Q.front();
          Q.pop();
           visit[u]=false;
           for(int i=head[u];i!=-1;i=node[i].next)
          { //这一点一开始写的是 错的离谱,, 
          /*{ if(dist[u]+node[i].len<dist[node[i].to]) 
               dist[node[i].to]=dist[u]+node[i].len;
                  if(!visit[node[i].to])
                  { Q.push(node[i].to);
                    visit[node[i].to]=true;
                   }
          } */
             if(dist[u]+node[i].len<dist[node[i].to]) 
             {
                 dist[node[i].to]=dist[u]+node[i].len;
                  if(!visit[node[i].to])
                  { Q.push(node[i].to);
                    visit[node[i].to]=true;
                   }
              }
            }
        
}
int main()
{   int Case;
   scanf("%d",&Case);
    while(Case--)
    {      init();
        scanf("%d%d%d",&s,&n,&m);
        for(int i=0;i!=m;++i)
        { int a,b,c;
          scanf("%d%d%d",&a,&b,&c);
           Add(a,b,c);
           Add(b,a,c);
        }
        for(int i=1;i<=n;++i)
         scanf("%d",&cost[i]);
         SPFA();
         for(int i=1;i<=n;++i)
         for(int j=s;j>=dist[i];--j)
          result[j]=max(result[j-dist[i]]+cost[i],result[j]);
          printf("%d\n",result[s]);
        }
     //system("pause");
     return 0;
    }
  
  
  

我感觉像邻接表,循环链表了,能自己写的自己写也挺好的,,毕竟容易查找错误,而且能加深对邻接表,循环链表的理解,,

 #include<iostream>
 #include<algorithm>
 #include<cstdio>
 #include<string.h>
 #define N 101
 #define M 0x3f
 using namespace std;
 typedef struct { int to,len,next;
         }Node;
 Node node[1000*N];
 int dist[N],head[N],cost[N],result[10000*N],Q[N*1000];
 bool visit[N];
 int num,s,n,m;
  void init()
  { num=0;
    memset(head,-1,sizeof(head));
    memset(result,0,sizeof(result));
     memset(dist,M,sizeof(dist));//有时候这样初始化不正确
     /* 这样写保险,,,, for(int i=0;i<=n;++i)
                            dist[i]=M;*/ 
       
  }
  void Add(int a,int b,int c)
  {  node[num].len=c;
     node[num].to= b;
     node[num].next=head[a];
     head[a]=num++;
  }
  void SPFA()
  {   dist[0]=0;
      memset(visit,false,sizeof(visit));
      int top=-1,tail=-1;
      Q[++top]=0;
      visit[0]=true;
      while(top>tail)
      {  int u=Q[++tail];
           visit[u]=false;
           for(int i=head[u];i!=-1;i=node[i].next)
            if(dist[u]+node[i].len<dist[node[i].to]) 
             {  dist[node[i].to]=dist[u]+node[i].len;
                  if(!visit[node[i].to])
                  { Q[++top]=node[i].to;
                    visit[node[i].to]=true;
                   }
             }
  }
  }
int main()
{   int Case;
   scanf("%d",&Case);
    while(Case--)
    {      init();
        scanf("%d%d%d",&s,&n,&m);
        for(int i=0;i!=m;++i)
        { int a,b,c;
          scanf("%d%d%d",&a,&b,&c);
           Add(a,b,c);
           Add(b,a,c);
        }
        for(int i=1;i<=n;++i)
         scanf("%d",&cost[i]);
         SPFA();
         for(int i=1;i<=n;++i)
         for(int j=s;j>=dist[i];--j)
          result[j]=max(result[j-dist[i]]+cost[i],result[j]);
          printf("%d\n",result[s]);
        }
     //system("pause");
     return 0;
    }
  
  
 



你可能感兴趣的:(SPFA+DP&&http://acm.nyist.net/JudgeOnline/problem.php?pid=203)