• POJ 3411 Paid Roads(DFS)


    题目链接

    点和边 都很少,确定一个界限,爆搜即可。判断点到达注意一下,如果之前已经到了,就不用回溯了,如果之前没到过,要回溯。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <string>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <vector>
     7 #include <queue>
     8 using namespace std;
     9 struct node
    10 {
    11     int a,b,c,p,r,next;
    12 } edge[101];
    13 int first[21],t,minz;
    14 int o[21],n;
    15 void CL()
    16 {
    17     t = 1;
    18     memset(first,-1,sizeof(first));
    19     memset(o,0,sizeof(o));
    20 }
    21 void add(int a,int b,int c,int p,int r)
    22 {
    23     edge[t].a = a;
    24     edge[t].b = b;
    25     edge[t].c = c;
    26     edge[t].p = p;
    27     edge[t].r = r;
    28     edge[t].next = first[a];
    29     first[a] = t ++;
    30 }
    31 void dfs(int x,int sum)
    32 {
    33     int i,v,s,z;
    34     if(sum >= minz)
    35         return ;
    36     if(x == n)
    37     {
    38         minz = min(sum,minz);
    39         return ;
    40     }
    41     for(i = first[x]; i != -1; i = edge[i].next)
    42     {
    43         v = edge[i].b;
    44         s = edge[i].c;
    45         z = 0;
    46         if(o[s])
    47         {
    48             if(o[v])
    49             z = 1;
    50             else
    51             o[v] = 1;
    52             dfs(v,sum+edge[i].p);
    53             if(z == 0)
    54             o[v] = 0;
    55         }
    56         else
    57         {
    58             if(o[v])
    59             z = 1;
    60             else
    61             o[v] = 1;
    62             dfs(v,sum+edge[i].r);
    63             if(z == 0)
    64             o[v] = 0;
    65         }
    66     }
    67     return ;
    68 }
    69 int main()
    70 {
    71     int i,m,sum;
    72     int a,b,c,p,r;
    73     scanf("%d%d",&n,&m);
    74     CL();
    75     sum = 0;
    76     for(i = 1; i <= m; i ++)
    77     {
    78         scanf("%d%d%d%d%d",&a,&b,&c,&p,&r);
    79         add(a,b,c,p,r);
    80         sum += r;
    81     }
    82     minz = sum+1;
    83     o[1] = 1;
    84     dfs(1,0);
    85     if(minz == sum+1)
    86         printf("impossible
    ");
    87     else
    88         printf("%d
    ",minz);
    89     return 0;
    90 }
  • 相关阅读:
    rabbitmq消息路由
    rabbitmq消息消费
    python中的正则匹配
    Spectral Grouping Using Nystrom Method
    基于WKPCA的多路谱聚类算法
    基于加权KPCA的谱聚类算法
    单词拆分
    完全平方数
    零钱兑换
    组合总数
  • 原文地址:https://www.cnblogs.com/naix-x/p/3175215.html
Copyright © 2020-2023  润新知