POJ 3249 拓撲排序 動態規劃

2021-06-07 01:46:14 字數 1351 閱讀 6902

該題是讓求在乙個有向無環圖中,從乙個入度為 0 的節點出發,到乙個出度為 0 的節點的最大的權值問題。我們可以使用廣搜,但是會超時,上網查了一下解題報告,可以使用拓撲排序+動態規劃來解決此問題:

dp[1] = max;

dp[2] = cost[2] + dp[4];

dp[3] = cost[3] + dp[4];

dp[4] = cost[4];

dp[5] = cost[5] + dp[6];

dp[6] = cost[6];

在拓撲排序的過程中,是入度為0的節點先入佇列,所以我們可以做乙個逆置思考,是的 dp[i] 儲存的是入度為零的節點到當前節點的最大權值和,而最後在出度為 0 的節點的 dp[i] 中搜尋最大的權值。**實現如下:

#include #include #include using namespace std;

#define n 100100

#define m 1000100

#define inf 1<<29

struct node

edge[m];

int dp[n]; // 最大價值 儲存 由 拓撲排序後 入度為0的節點到當前節點最大的 profit

int enext[n]; //記錄節點 i 當前的邊,由當前的邊 推出 下一條邊

int indegree[n]; //入度

int cost[n]; //價值

int res;

int idx;

std::queueq;

int m,n,a,b,i,j;

void input()

idx=0;

//memset(dp,-inf,sizeof(int)*(n+10) );

//memset(indegree,0,sizeof(int)*(n+10) ); //節點度數初始化為0

memset(enext,-1,sizeof(enext) ); //說明當前節點只此一條邊

for(i=1;i<=m;i++)

while( !q.empty() )

q.pop();

for( i=1;i<=n;i++)

if( !indegree[i] )

q.push(i),dp[i]=cost[i];

}int dag()

return res;

}int main()

return 0;

}

說明:本題對時間要求很苛刻,由於資料量大,輸入輸出必須用 scanf 和 printf 才能保證不超時,同時要避免使用 動態的開闢空間,new 和 delete 同樣會有很大的時間開銷。

POJ 3249 記憶化搜尋,,,,DAG最長路

題目大意 給出n個點,m條邊,每個點都提供了相對的點權值,然後給出相連著的邊,問從起點走到終點最大利潤值。起點是入度為0的點,終點是出度為0的點。思路1 spfa求最長路,正向建邊tle,反向建邊4400msac。2 記憶化搜尋,每次都儲存當前點到終點獲得的最大利潤。ac 搜尋 1844ms inc...

POJ 1094 拓撲排序

文章大意是將n個字母排序 n 26 最終必須排成鍊錶式的輸出 一旦確定或者出現環,記錄當前步數,後續輸入無視 加個拓撲排序判斷圖的總結 1 如果輸入的有向圖中的點,不存在入度為0的點,則存在迴路,反過來則不成立 2 如果入隊的點的個數小於輸入的點的個數,則肯定存在迴路 3 如果存在的入度為零的點大於...

拓撲排序 poj1094

此題題目有點小問題,那也是很多人ac不了的原因 問題是,當給定的前k項條件能夠確定出大小順序時,即便k項之後出現了矛盾條件,輸出也應該是sorted sequence determined after k relations 後面再輸出排序好的序列!include include using nam...