pku 1724 roads 解题报告
此题并不难,就是利用深搜就可以解决问题,但却让我吃尽了苦头.从一开始的wa,再改进算法,却一直TLE.一直搞不明白.终于在discuss中发现,自己数据结构的存储方式选择错了.于是改了数据结构的存储方式,才AC了.可自己觉得学到不少,收获良多.
TLE的存储方式:
void input()
{
int i, S, D, L, T;
// memset(graph, 0, sizeof(graph));
for (i = 1; i <= N; i++)
{
graph[i]->next = NULL;
}
scanf("%d%d%d", &K, &N, &R);
for (i = 0; i < R; i++)
{
scanf("%d%d%d%d", &S, &D, &L, &T);
node *temp = new node;
temp->point = D; temp->length = L; temp->value = T; temp->next = NULL;
if (graph[S] == NULL)
{
graph[S] = temp;
}
else
{
node *tmp = graph[S];
while (tmp->next)
{
tmp = tmp->next;
}
tmp->next = temp;
}
}
}
AC代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 150
typedef struct node
{
int point;
int length;
int value;
struct node *next;
}adjv;
adjv graph[M];
adjv sp[M * M];
int ans;
int K, N, R;
void input()
{
int i, S, D, L, T;
// memset(graph, 0, sizeof(graph));
for (i = 1; i <= N; i++)
{
graph[i].next = NULL;
}
// scanf("%d%d%d", &K, &N, &R);
int count = 0;
for (i = 0; i < R; i++)
{
scanf("%d%d%d%d", &S, &D, &L, &T);
node* temp = &sp[count++];
temp->point = D; temp->length = L; temp->value = T;
temp->next = graph[S].next;
graph[S].next = temp;
}
for (i = 1; i <= N; i++)
{
for (node *tmp = graph[i].next; tmp; tmp = tmp->next)
{
printf("%d:(%d %d) ", tmp->point, tmp->length, tmp->value);
}
printf("/n");
}
}
bool visit[M];
void dfs(int now, int value, int length)
{
for (node *temp = graph[now].next; temp; temp = temp->next)
{
if (temp->value + value <= K && !visit[temp->point] && (ans > length + temp->length || ans == -1))
{
if (temp->point == N)
{
ans = length + temp->length;
continue;
}
visit[temp->point] = true;
dfs(temp->point, value + temp->value, length + temp->length);
visit[temp->point] = false;
}
}
}
int main()
{
//freopen("1.txt", "r", stdin);
while (scanf("%d%d%d", &K, &N, &R) != EOF)
{
input();
ans = -1;
memset(visit, false, sizeof(visit));
visit[1] = true;
dfs(1, 0, 0);
printf("%d/n", ans);
}
return 0;
}