之前没做过图相关的题,所以一开始在构建数据结构的时候思考了很久,然后翻看严老师的《数据结构》看到了邻接表的表示方法,并且本身用dfs邻接表也就很适合,然后又瞄了一眼别人题解的数据结构表示,发现还可以用数组先存数据然后用结构体内设置参数对数组索引来代替指针。
关于这题,如果不对去过的路进行剪枝,会出现RunTimeError一开始我以为是数组越界对着代码查了好久,然后考虑到可能是栈过载,在加入了vis[]数组记录去过的城市,AC
代码如下:
POJ: 512K 125MS
//不加vis剪枝会出现Runtime error目测是栈过载导致的
#include<cstdio>
#include<cstring>
#define mem(a, b) memset(a,b,sizeof(a))
#define INT_MAX 0x7fffffff
using namespace std;
const int maxCitysize = 120;
const int maxRoadsize = 10200;
int K,N,R;//K: number of coins, N: city numbers, R: road numbers
int rid;//
int minl;//记录下最短的路程
typedef struct Road{
int s;//起始城市
int d;//指向的城市
int len;//距离
int toll;//路费
int next;
}rr;
rr r[maxRoadsize];
int firstC[maxCitysize];
bool vis[maxCitysize];
void add_road(int s, int d, int l, int t){//邻接表
r[rid].s = s;
r[rid].d = d;
r[rid].len = l;
r[rid].toll = t;
r[rid].next = firstC[s];
firstC[s] = rid++;
}
void dfs(int NowC, int Nowl, int Restm){
if(Restm < 0 || Nowl > minl)
return;
if(NowC == N){
if(Nowl < minl) minl = Nowl;
return;
}
for(int i = firstC[NowC]; i != -1; i = r[i].next){
int city = r[i].d;
if(!vis[city]){
vis[city] = true;
dfs(r[i].d, Nowl+r[i].len, Restm-r[i].toll);
vis[city] = false;
}
}
}
int main(){
int s,d,l,t;
scanf("%d\n%d\n%d", &K, &N, &R);
minl = INT_MAX;
rid = 0;
mem(firstC, -1);
mem(vis,false);
for(int i = 0; i < R; i++){
scanf("%d%d%d%d", &s, &d, &l, &t);
add_road(s,d,l,t);
}
dfs(1, 0, K);
if(minl == INT_MAX)
printf("-1\n");
else
printf("%d", minl);
return 0;
}