題目大意:給出n個點,m條邊,每個點都提供了相對的點權值,然後給出相連著的邊,問從起點走到終點最大利潤值。起點是入度為0的點,終點是出度為0的點。
思路1:spfa求最長路,正向建邊tle,反向建邊4400msac。。。。
2:記憶化搜尋,每次都儲存當前點到終點獲得的最大利潤。
ac**,搜尋 ....1844ms:
#include#include#include#include#includeusing namespace std;
const int maxn = 100100;
const int inf = 0x3f3f3f3f3f;
int head[maxn];
int v[maxn];
int son[maxn];
struct node
node(int v,int next):v(v),next(next) {}
}edge[maxn*10];
int maxx = -inf;
int depth[maxn];
int dfs(int st)
int main()
for(int i = 1;i <= n;i ++)
if(son[i] == 0) dfs(i);
for(int i = 1;i <= n;i ++)
if(son[i] == 0 && depth[i] > maxx)
maxx = depth[i];
printf("%d\n",maxx);
}return 0;
}
spfa 最長路...4400ms:
#include#include#include#include#include#includeusing namespace std;
const int maxn = 100100;
const int inf = 0x3f3f3f3f;
int head[maxn];
int v[maxn];
int dis[maxn];
int son[maxn];
int vis[maxn];
struct node
node(int v,int next,int w):v(v),next(next),w(w) {}
}edge[maxn*10];
int maxx = -inf;
int main()
maxx = -inf;
int a,b; int cnt = 0;
for(int i = 1;i <= n;i ++)
scanf("%d",&v[i]);
for(int i = 0;i < m;i ++)
queueq;
for(int i = 1;i <= n;i ++)
if(son[i] == 0)
while(!q.empty())}}
}for(int i = 1;i <= n;i ++)
if(head[i] == -1 && dis[i] > maxx)
maxx = dis[i];
printf("%d\n",maxx);
}return 0;
}
poj 3249 bfs dp或者記憶化搜尋
思路 dp i 表示到點i的最大收益,初始化為 inf,然後從入度為0點開始bfs就可以了,一開始一直tle,然後優化了好久才4000ms險過。之後有寫了個dfs記憶化搜尋,果然快多了。bfs ac code 1 include2 include3 include4 include5 include...
POJ 3249 拓撲排序 動態規劃
該題是讓求在乙個有向無環圖中,從乙個入度為 0 的節點出發,到乙個出度為 0 的節點的最大的權值問題。我們可以使用廣搜,但是會超時,上網查了一下解題報告,可以使用拓撲排序 動態規劃來解決此問題 dp 1 max dp 2 cost 2 dp 4 dp 3 cost 3 dp 4 dp 4 cost ...
poj 1579(記憶化搜尋)
consider a three parameter recursive function w a,b,c if a 0 or b 0 or c 0,then w a,b,c returns 1 if a 20 or b 20 or c 20,then w a,b,c returns w 20,20...