1. 程式人生 > >urumuqi H skiing DP

urumuqi H skiing DP

ems tac skiing 表示 沒有 ret pri 每天 none

  題目鏈接: 一如既往的沒有啊 老哥

  題目描述: 給以一個有向圖, 每個邊上有權值, 問你一條通路的最大權值是多少

  解題思路: 這道題應該很裸吧,......自己記得以前做過啊, 自己寫崩了, 明天早起去看看紫書, 那裏我記得是有的啊

  代碼: 剛才自己總算調出來了, 自己寫過的東西怎麽忘得這麽快啊......

技術分享
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include 
<cmath> #include <algorithm> #include <stack> #include <deque> #include <map> #include <set> #include <queue> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define
sca(x) scanf("%d",&x) #define de printf("=======\n") typedef long long ll; using namespace std; const ll t = 1e8; const int maxn = 1e4+100; map<pair<int, int>, int> p; int d[maxn]; // d[i] 表示i號節點為起點的最長距離為d[i] int isend[maxn]; int n, m; int dfs( int index ) { if( isend[index] ) return
0; for( int i = 1; i <= n; i++ ) { if( i != index ) { int dis = p[make_pair(index, i)]; if( dis ) { d[index] = max( d[index], dis + dfs(i) ); } } } return d[index]; } int main() { int t; sca(t); while( t-- ) { scanf( "%d%d", &n, &m ); p.clear(); mem0(d); mem0(isend); for( int i = 1; i <= m; i++ ) { int s, e, l; scanf( "%d%d%d", &s, &e, &l ); p.insert(make_pair(make_pair(s, e), l)); isend[s] = 0; isend[e] = 1; } int ans = 0; for( int i = 1; i <= n; i++ ) { ans = max( ans, dfs(i) ); } printf( "%d\n", ans ); } return 0; }
View Code

  思考: 記性太差啦, 以後得每天一道數據結構了, 畢竟數據結構太重要了, 今天是不是又沒寫面試總結啊......... 然後自己關於這個程序是怎麽寫的還是有疑問的, 明天參照紫書, 然後自己仔細看看自己的程序, 別不長記性。

urumuqi H skiing DP