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;
    }
  • 相关阅读:
    5.16
    4.29
    二十节 作业
    作业
    作业
    控件
    选择排序
    百钱买百鸡
    用颜色变色变换来调整图像的对比度和亮度
    图像的裁剪
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3293509.html
Copyright © 2011-2022 走看看