zoukankan      html  css  js  c++  java
  • poj3411Paid Roads

    题目链接:

    http://poj.org/problem?id=3411

    题目:

    Paid Roads
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 5080   Accepted: 1784

    Description

    A network of m roads connects N cities (numbered from 1 toN). There may be more than one road connecting one city with another. Some of the roads are paid. There are two ways to pay for travel on a paid roadi from city ai to city bi:

    • in advance, in a city ci (which may or may not be the same asai);
    • after the travel, in the city bi.

    The payment is Pi in the first case and Ri in the second case.

    Write a program to find a minimal-cost route from the city 1 to the city N.

    Input

    The first line of the input contains the values of N and m. Each of the following m lines describes one road by specifying the values ofai,bi, ci,Pi,Ri (1 ≤ i m). Adjacent values on the same line are separated by one or more spaces. All values are integers, 1 ≤m, N ≤ 10, 0 ≤Pi , Ri ≤ 100,PiRi (1 ≤ i m).

    Output

    The first and only line of the file must contain the minimal possible cost of a trip from the city 1 to the cityN. If the trip is not possible for any reason, the line must contain the word ‘impossible’.

    Sample Input

    4 5
    1 2 1 10 10
    2 3 1 30 50
    3 4 3 80 80
    2 1 2 10 10
    1 3 2 10 50

    Sample Output

    110

    Source

    Northeastern Europe 2002, Western Subregion
    这个题目的意思是有两种付费方式。

    1:假设曾经经过c城市,那么就在c城市付费。

    2:假设没有经过,那么就在b城市付费。。

    还有注意题目中的数据为m<10,所以每一个点最多走3次。。

    由于成环的话那么最少3个点。则最少3路。

    所以最多走3次。

    故应用int vis[ manx]。。。

    然后dfs回溯。。。


    所以代码为:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define INF 0x3f3f3f3f
    const int maxn=10+10;
    int vis[maxn];
    int min_cost,fee;
    int n,m;
    struct node
    {
        int a,b,c,p,r;
    }e[maxn];
    void dfs(int x,int fee)
    {
        if(x==n&&min_cost>fee)
        {
            min_cost=fee;
            return;
        }
        if(x==n)
            return;
        for(int i=1;i<=m;i++)
        {
            if(e[i].a==x&&vis[e[i].b]<3)
            {
                vis[e[i].b]++;
                if(vis[e[i].c])
                    dfs(e[i].b,fee+e[i].p);
                else
                    dfs(e[i].b,fee+e[i].r);
                vis[e[i].b]--;
            }
        }
    }
    
    int main()
    {
       while(scanf("%d %d",&n,&m)!=EOF)
       {
           memset(vis,0,sizeof(vis));
           min_cost=INF;
           for(int i=1;i<=m;i++)
           {
               scanf("%d%d%d%d%d",&e[i].a,&e[i].b,&e[i].c,&e[i].p,&e[i].r);
           }
           vis[1]=1;
           dfs(1,0);
           if(min_cost!=INF)
              printf("%d
    ",min_cost);
           else
             printf("impossible
    ");
       }
       return 0;
    }
    


  • 相关阅读:
    《柯尔特思维教程》-第3章(交互)- 第3节:证据的价值
    《柯尔特思维教程》-第3章(交互)- 第2节:证据类型
    《柯尔特思维教程》-第3章(交互)- 第1节:CoRT交互 EBS(Examine Both Sides,研究双方的观点)
    《柯尔特思维教程》-第2章(组织)- 第10节:结论
    《柯尔特思维教程》-第2章(组织)- 第9节:巩固
    《柯尔特思维教程》-第2章(组织)- 第8节:集中
    java 创建对象的几种方式
    关于final
    关于静态-static
    重温js浅拷贝、深拷贝
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6758629.html
Copyright © 2011-2022 走看看