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