• poj 1724ROADS(bfs和dfs做法)


     1 /*
     2 dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过!
     3 */
     4 #include<iostream> 
     5 #include<cstdio>
     6 #include<cstring>
     7 #include<vector>
     8 #include<algorithm>
     9 #define Max 0x3f3f3f3f
    10 using namespace std;
    11 
    12 struct node{
    13    int D;
    14    int L, T;
    15    node(int D, int L, int T){
    16       this->D=D;
    17       this->L=L;
    18       this->T=T;
    19    }
    20    node(){
    21    }
    22 };
    23 
    24 node v[105][1000];
    25 int cnt[105];
    26 int vis[105];
    27 
    28 int maxCost, R, N, S, D, L, T;
    29 int cost, dist;
    30 
    31 void dfs(int cur, int d, int c){
    32    int i;
    33    if(cur == N){
    34        if(dist>d){
    35           dist=d;
    36           if(cost>c)  cost=c;
    37        }
    38        return ;
    39    }
    40    for(i=cnt[cur]-1; i>=0; --i)
    41       if(!vis[v[cur][i].D] &&  c+v[cur][i].T<=maxCost && d+v[cur][i].L<dist){
    42          vis[v[cur][i].D]=1;
    43          dfs(v[cur][i].D, d+v[cur][i].L, c+v[cur][i].T);
    44          vis[v[cur][i].D]=0;
    45       }
    46 }
    47 
    48 int main(){
    49    while(scanf("%d", &maxCost)!=EOF){
    50        scanf("%d%d", &N, &R);
    51        memset(cnt, 0, sizeof(cnt));
    52        while(R--){
    53           scanf("%d%d%d%d", &S, &D, &L, &T);
    54           v[S][cnt[S]++]=node(D, L, T);
    55        }
    56        cost=dist=Max;
    57        memset(vis, 0, sizeof(vis));
    58        dfs(1, 0, 0);
    59        if(cost<=maxCost)
    60           printf("%d
    ", dist);
    61        else printf("-1
    ");
    62    }
    63    return 0;
    64 }
     1 /*
     2   spfa + 01背包 
     3   dist[next][j]=min(dist[cur][j-v[cur][i].T]+v[cur][i].L) j={v[cur][i].T。。。maxCost}
     4   一维数组表示的是城市节点,二维表示的当前费用
     5   dist[i][j]表示经过i城市,费用为j时总的路径长度! 
     6 */
     7 #include<iostream> 
     8 #include<cstdio>
     9 #include<cstring>
    10 #include<vector>
    11 #include<queue>
    12 #include<algorithm>
    13 #define Max 0x3f3f3f3f
    14 using namespace std;
    15 
    16 struct node{
    17    int D;
    18    int L, T;
    19    node(int D, int L, int T){
    20       this->D=D;
    21       this->L=L;
    22       this->T=T;
    23    }
    24    node(){
    25    }
    26 };
    27 
    28 node v[105][1000];
    29 int cnt[105];
    30 int dist[105][10005];
    31 int vis[105];
    32 queue<int>q;
    33 int maxCost, R, N, S, D, L, T;
    34 
    35 int spfa(){
    36    int i;
    37    while(!q.empty()){
    38        int cur = q.front();
    39        q.pop();
    40        vis[cur]=0;
    41        for(i=0; i<cnt[cur]; ++i){
    42            int next=v[cur][i].D;
    43            for(int j=v[cur][i].T; j<=maxCost; ++j)
    44               if(dist[next][j]>dist[cur][j-v[cur][i].T]+v[cur][i].L){
    45                  dist[next][j]=dist[cur][j-v[cur][i].T]+v[cur][i].L;
    46                  if(!vis[next]){
    47                    vis[next]=1;
    48                    q.push(next);
    49                  }
    50              }
    51        }
    52    }
    53 }
    54 
    55 void bfs(int cur){
    56    q.push(1);
    57    memset(dist, 0x3f, sizeof(dist));
    58    for(int i=0; i<105; ++i)
    59       dist[1][i]=0;
    60    vis[1]=1;
    61    spfa();
    62 }
    63 
    64 int main(){
    65    while(scanf("%d", &maxCost)!=EOF){
    66        scanf("%d%d", &N, &R);
    67        memset(cnt, 0, sizeof(cnt));
    68        while(R--){
    69           scanf("%d%d%d%d", &S, &D, &L, &T);
    70           v[S][cnt[S]++]=node(D, L, T);
    71        }
    72        memset(vis, 0, sizeof(vis));
    73        bfs(1);
    74        int minDist=Max;
    75        for(int i=1; i<=maxCost; ++i)
    76           if(minDist>dist[N][i])
    77               minDist=dist[N][i];
    78        if(minDist!=Max)
    79           printf("%d
    ", minDist);
    80        else printf("-1
    ");
    81    }
    82    return 0;
    83 }
  • 相关阅读:
    Eclipse快捷键大全
    Quartz任务调度快速入门
    Spring整合logback日志
    Java实现二维码的生成与解析
    跨域问题及解决方案
    SpringBoot项目直接在linux下运行
    SpringBoot拦截器中使用RedisTemplate
    Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集
    HDU 4489 The King’s Ups and Downs dp
    HDU 4747 Mex 递推/线段树
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3874165.html
Copyright © 2020-2023  润新知