pku 1724 roads 深搜 解题报告

 

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;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值