zoukankan      html  css  js  c++  java
  • poj 3411 Paid Roads

      题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用。

      DFS

      刚开始想到了用搜索,自己搜索学的不好,有几个问题解决不了,首先就是每个点可以走多次,不能用0,1标记一个点是否走过,如果不标记就可能在一直走一条循环路,还有就是不会回溯,总之,自己就是不会写...

      网上抄的别人的代码,每个点最多可以走3次,回溯也挺简单...

    #include<stdio.h>
    #include<string.h>
    
    int n,m;
    struct node{
        int a,b,c,p,r;
    };
    node road[11];
    int visit[11],mincost;
    void DFS(int a,int fee)
    {
        if(a==n && mincost>fee)
        {
            mincost=fee;
            return;
        }
        for(int i=1;i<=m;i++)
        {
            if(a==road[i].a && visit[road[i].b]<=3)
            {
                int b=road[i].b;
                visit[b]++;
                if(visit[road[i].c])
                    DFS(b,fee+road[i].p);
                else
                    DFS(b,fee+road[i].r);
                visit[b]--;
            }
        }
        return ;
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(visit,0,sizeof(visit));
            visit[1]=1;
            mincost=2000;
            for(int i=1;i<=m;i++)
                scanf("%d%d%d%d%d",&road[i].a,&road[i].b,&road[i].c,&road[i].p,&road[i].r);
            DFS(1,0);
            if(mincost==2000)
                printf("impossible
    ");
            else
                printf("%d
    ",mincost);
        }
        return 0;
    }
  • 相关阅读:
    webdriver学习
    [Sqlite]-->Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程(转)
    java 二维码
    java 解析json超大文件(转)
    嵌套三目运算符
    实体的字段以is开头的教训
    easyui中formatter的使用
    springmvc中的controller是单例的
    hibernate 中baseservice中添加事物
    easyui中添加富文本编辑器
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3293509.html
Copyright © 2011-2022 走看看