题目链接

题意 : 要从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\n",ans) ;
75         else printf("impossible\n") ;
76     }
77     return 0 ;
78 }
View Code

相关文章: