zoukankan      html  css  js  c++  java
  • POJ 3411 Paid Roads(SPFA || DFS)

    题目链接

    题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长。

    思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态压缩一下,第二维来记录状态,表示到过这个点的第几个状态。也可以用DFS,因为最多十个点,所以如果走某一个点走过三遍说明就是真的只增加费用了,也就是真正的在走环路了。DFS分析

    二维SPFA

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #include <iostream>
     5 
     6 using namespace std ;
     7 
     8 struct node
     9 {
    10     int uu ;
    11     int p,r ;
    12     bool vis ;
    13 } mapp[12][12];
    14 
    15 int N,m ;
    16 int dis[12][1025] ;
    17 int cost ;
    18 bool vist[12] ;
    19 const int INF = 9999999 ;
    20 
    21 int spfa()
    22 {
    23     queue<pair<int,int> >Q ;
    24     Q.push(make_pair(1,1)) ;
    25     for(int i = 1 ; i < 12 ; i++)
    26         for(int j = 1 ; j < 1025 ; j++)
    27             dis[i][j] = INF ;
    28     memset(vist,false ,sizeof(vist)) ;
    29     dis[1][1] = 0 ;
    30     while(!Q.empty())
    31     {
    32         int a = Q.front().first ;
    33         int b = Q.front().second ;
    34         Q.pop() ;
    35         vist[a] = false ;
    36         for(int i = 1 ; i <= N ; i++)
    37         {
    38             if(mapp[a][i].vis)
    39             {
    40                 if( b & (1 << (mapp[a][i].uu-1))) cost = mapp[a][i].p ;//減一是為了讓狀態從1開始,1,2,4....
    41                 else cost = mapp[a][i].r ;
    42                 if(dis[i][b | (1 << (mapp[a][i].uu-1))] > cost + dis[a][b])
    43                 {
    44                     dis[i][b | (1 << (mapp[a][i].uu-1))] = cost + dis[a][b] ;
    45                     if(!vist[i])
    46                     {
    47                         vist[i] = true ;
    48                         Q.push(make_pair(i,b | (1 << (mapp[a][i].uu-1)))) ;
    49                     }
    50                 }
    51             }
    52         }
    53     }
    54     int minn = INF ;
    55     for(int i = 1 ; i < 1 << N  ; i++)
    56         minn = min(minn,dis[N][i]) ;
    57     return minn ;
    58 }
    59 int main()
    60 {
    61     int u,v,uu,p,r ;
    62     while(~scanf("%d %d",&N,&m))
    63     {
    64         for(int i = 1 ; i <= m ; i++)
    65         {
    66             scanf("%d %d %d %d %d",&u,&v,&uu,&p,&r) ;
    67             mapp[u][v].vis = true ;
    68             mapp[u][v].uu = uu ;
    69             mapp[u][v].p = p ;
    70             mapp[u][v].r = r ;
    71         }
    72         int ans = spfa() ;
    73         if(ans < INF)
    74             printf("%d
    ",ans) ;
    75         else printf("impossible
    ") ;
    76     }
    77     return 0 ;
    78 }
    View Code

    DFS

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #define oo 9999999
     5 using namespace std ;
     6 
     7 int N,M ;
     8 struct node
     9 {
    10     int u,v,w ;
    11     int P,R ;
    12 } road[12];
    13 int vis[12] ,ans;
    14 
    15 void dfs(int u,int cost)
    16 {
    17     if(u == N && ans > cost)
    18     {
    19         ans = cost ;
    20         return ;
    21     }
    22     for(int i = 0 ; i < M ; i++)
    23     {
    24         if(u == road[i].u && vis[road[i].v] <= 3)
    25         {
    26             vis[road[i].v] ++ ;
    27             if(vis[road[i].w])
    28                 dfs(road[i].v,cost+road[i].P) ;
    29             else dfs(road[i].v,cost+road[i].R) ;
    30             vis[road[i].v] -- ;
    31         }
    32     }
    33 }
    34 int main()
    35 {
    36     while(~scanf("%d %d",&N,&M))
    37     {
    38         for(int i = 0 ; i < M ; i++)
    39             scanf("%d %d %d %d %d",&road[i].u,&road[i].v,&road[i].w,&road[i].P,&road[i].R) ;
    40         memset(vis,0,sizeof(vis)) ;
    41         vis[1] = 1 ;
    42         ans = oo ;
    43         dfs(1,0) ;
    44         if(ans == oo)
    45             printf("impossible
    ") ;
    46         else
    47             printf("%d
    ",ans) ;
    48     }
    49     return 0 ;
    50 }
    View Code
  • 相关阅读:
    如何制作URL文件
    对象映射工具AutoMapper介绍
    C#高阶函数介绍
    System.Web.Caching.Cache
    系统架构设计:进程缓存和缓存服务,如何抉择?
    System.Web.Caching.Cache类 缓存 各种缓存依赖
    max server memory (MB)最大服务器内存配置--缓解内存压力
    第0节:.Net版基于WebSocket的聊天室样例
    第六节:Core SignalR中的重连机制和心跳监测机制详解
    第五节:SignalR完结篇之依赖注入和分布式部署
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3757713.html
Copyright © 2011-2022 走看看