ÕâÖÖÌ⻹ÊÇÂù³£¼ûµÄ£¬SPFA+DPÓÅ»¯£¬¼ÇµÃÉϴα±´óУÈü¾ÍÓÐÒ»µÀ¡£ ¸ù¾ÝÌâÒ⣬ÎÒÃÇ¿ÉÒÔÐéÄâÁ½¸ö³¬¼¶Ô´µãºÍ³¬¼¶»ãµã£¬Ô´µãµ½ËùÓеãµÄ¾àÀë¶¼ÊÇÕâ¶Î¾àÀë¼ÓÉϲι۵Äʱ¼ä¡£ËùÓе㵽»ãµãµÄ¾àÀë¾ÍÊǸõ㵽ÖÕµãµÄ¾àÀë¡£ ÕâÑù¿ØÖÆÖ®ºó£¬¶ÔÓÚÖÕµã¾ÍÓÐ2¸öÑ¡ÔñÁË£¬Â·¹ý»òÕ߲ιۡ£ ¶ÔÓÚ;ÖгýÆðµãÖÕµãÒÔÍâµÄµã£¬ÎÒÃÇ¿ÉÒÔÏȽøÐÐÒ»±éfloyd,È»ºó¸ù¾ÝËûÃǵÄvalÖµ½øÐÐÁ¬±ß£¬ÖµÊÇÁ½µãÖ®¼äµÄ¾àÀë¼ÓÉϲι۵Äʱ¼ä¡£ÕâÑù¶ÔÓÚÿһµãÆäʵҲÓÐÁ½¸öÑ¡ÔñÁË£¬¿ÉÒԲι۸õ㣬¼´a -> b,Ò²¿ÉÒÔ·¹ý¸Ãµã£¬¼´a -> b£¨Â·¹ý£¬floyd±£Ö¤ÁËÕâÒ»µã£© ->c. È»ºó´ÓÔ´µã¿ªÊ¼ÅÜÒ»±éspfa,×îºóÔÚÖÕµãºÍ³¬¼¶»ãµãÖ®¼äÕÒµ½Ò»¸ö×î´óÖµ£¬¾ÍÊǴ𰸡£ ÕâµÀÌâÆÚ¼ä·¸ÁËÒ»¸öºÜ2µÄ´íÎó£¬ÎÒÒѾ²»Äܶà˵ÁË¡£ ÏÂÃæÊÇ´úÂ룺 #include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define Max 2505 #define FI first #define SE second #define ll long long #define PI acos£¨-1.0£© #define inf 0x3fffffff #define LL£¨x£© £¨ x ¡¶ 1 £© #define bug puts£¨"here"£© #define PII pair<int,int> #define RR£¨x£© £¨ x ¡¶ 1 | 1 £© #define mp£¨a,b£© make_pair£¨a,b£© #define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£© #define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £© using namespace std; #define N 105 #define M 20005 #define K 305 int tim[N] , val[N] ; int Map[N][N] ; int n , m , s , e , t ; struct kdq { int s , e, l ,next ; } ed[M] ; int head[N] , num ; void add£¨int s , int e ,int l£© { ed[num].e = e ; ed[num].l = l ; ed[num].next = head[s] ; head[s] = num ++ ; } int vis[N][K] ; int dp[N][K] ;// dp[i][j]±íʾµãiÔÚʱ¼äjµÄʱºòµÄ×î´óÖµ PII qe[N * 1000] ; void init£¨£© { mem£¨head ,-1 £© ; num = 0 ; mem£¨val ,0£© ; mem£¨tim ,0£© ; for £¨int i = 0 ; i < N ; i ++ £© { for £¨int j = 0 ; j < N ; j ++ £© Map[i][j] = inf ; Map[i][i] = 0 ; } cin ¡· n ¡· m ¡· t ¡· s ¡· e ; for £¨int i = 0 ; i < n ; i ++ £©scanf£¨"%d",&tim[i]£© ; for £¨int i = 0 ; i < n ; i ++ £©scanf£¨"%d",&val[i]£© ; while£¨m -- £© { int x , y , z ; scanf£¨"%d%d%d",&x,&y,&z£© ; Map[x][y] = Map[y][x] = min£¨Map[x][y] , z£© ; } for £¨int k = 0 ; k < n ; k ++ £© for £¨int i = 0 ; i < n ; i ++ £© for £¨int j = 0 ; j < n ; j ++ £© Map[i][j] = min£¨Map[i][j] , Map[i][k] + Map[k][j]£© ; for £¨int i = 0 ; i < n ; i ++ £© { for £¨int j = i + 1 ; j < n ; j ++ £© { if£¨Map[i][j] != inf£© { if£¨val[i] > val[j]£©//¸ù¾ÝËûµÄ¼ÛÖµÉýÐò½¨±ß add£¨j , i , Map[i][j] + tim[i]£© ; else if£¨val[j] > val[i]£© add£¨i , j , Map[i][j] + tim[j]£© ; } } } add£¨n , s , tim[s]£© ;//S -> i , i -> E . S = n ,E = n + 1 . for £¨int i = 0 ; i < n ; i ++ £© { if£¨i != s && Map[i][s] != inf£© { add£¨n , i , tim[i] + Map[s][i]£© ; } if£¨i != e && Map[i][e] != inf£© { add£¨i , n + 1 , Map[e][i]£© ; } } for £¨int i = 0 ; i < N ; i ++ £© { for £¨int j = 0 ; j < K ; j ++ £© { dp[i][j] = 0 ; vis[i][j] = 0 ; } } vis[n][0] = 1 ; int hh = 0 , tt = 0 ; qe[hh ++ ] = mp£¨n , 0£© ; while£¨hh > tt£© { PII tp = qe[tt ++ ] ; int fk1 = tp.FI ; int fk2 = tp.SE ; vis[fk1][fk2] = 0 ; for £¨int i = head[fk1] ; ~i ; i = ed[i].next £© { int nxt = ed[i].e ; int l = ed[i].l + fk2 ; if£¨l > t£©continue ; if£¨dp[nxt][l] < dp[fk1][fk2] + val[nxt]£© { dp[nxt][l] = dp[fk1][fk2] + val[nxt] ; if£¨£¡vis[nxt][l]£© { vis[nxt][l] = 0 ; qe[hh ++ ] = mp£¨nxt , l£© ; } } } } int ans = 0 ; for £¨int i = 0 ; i <= t ; i ++ £© { ans = max£¨ans , dp[e][i]£© ; ans = max£¨ans , dp[n + 1][i]£© ; } printf£¨"%d\n",ans£© ; } int main£¨£© { int T ; cin ¡· T ; for £¨int i = 1 ; i <= T ; i ++ £© { printf£¨"Case #%d:\n",i£© ; init£¨£© ; } return 0 ; } |