POJ1724 ROADS

来源:互联网 发布:淘宝客服培训ppt模板 编辑:程序博客网 时间:2024/05/17 05:04

这个题目是一个比较简单dfs,用到的技巧并不多,只是常用的剪枝。两处剪枝即可:

1,当价钱超出K时;

2,当前的道路长度大于已经得到的道路长度时;

这个题目还有一点值的注意的是,不要用vector存图,这样容易TLE。改用邻接表就好。

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int MAX = 110;const int INF = 10000000;struct Edge{    int from, to, dist, cost;}edges[10010];int first[10010],next[10010],pro;void AddEdge(int from, int to, int dist, int cost){    edges[pro].from = from;    edges[pro].to = to;    edges[pro].dist = dist;    edges[pro].cost = cost;    next[pro] = first[from];    first[from] = pro++;}int vis[MAX];int n,m,mindist;void dfs(int s, int restcost, int nowdist){ //   printf("s = %d  nowcost = %d   nowdist = %d\n",s,nowcost, nowdist);    if (nowdist > mindist) return;    if (s == n && restcost >= 0 && nowdist < mindist){        mindist = nowdist;        return;    }    for (int i = first[s]; i != -1; i = next[i]){        Edge e = edges[i];        if (!vis[e.to] && restcost >= e.cost){            vis[e.to] = 1;            dfs(e.to, restcost-e.cost, nowdist+e.dist);            vis[e.to] = 0;        }    }    return;}int main(){    int K;    while (scanf("%d%d%d",&K,&n,&m) != EOF){        int x, y, z, w;        pro = 0;        memset(next, -1, sizeof(next));        memset(first, -1, sizeof(first));        memset(vis, 0,sizeof(vis));        for (int i = 0; i<m; i++){            scanf("%d%d%d%d",&x,&y,&z,&w);            AddEdge(x,y,z,w);        }        mindist = INF;        dfs(1,K,0);        if (mindist < INF) printf("%d\n",mindist);        else printf("-1\n");    }    return 0;}


0 0
原创粉丝点击