該題是讓求在乙個有向無環圖中,從乙個入度為 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...