这几天忙着复习也没顾得刷题,,罪过啊,,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;
}