POJ 3592(強連通縮點,拓撲最長路)

2021-09-11 06:21:18 字數 1344 閱讀 6334

題意:

n*m矩陣,*表示傳送門,矩陣後面給出其到達的點,#障礙點,不可到達,數字表示該點的寶藏數,每個點可以往下或者往右走,獲得寶藏後該點寶藏數變為0,問最多能獲得多少寶藏。

思路:建圖+強連通縮點+拓撲dp。

難點:構圖:#點不可做為起點也不可以作為終點。總共n*m個點,標號別和其他量弄混。

強連通縮點:只對「1」所處的塊tarjan即可,拓撲序同理。

ac**:

/**wjvje**/

#include #include #include #include #include #include#include #include #include #include#include#include/** -?£- **/

#define ll long long

#define par pair#define inf 0x3f3f3f3f

#define io ios::sync_with_stdio(false)

using namespace std;

const int n=1600+100;

const int m=3e6+100;

int head[n];

int ver[m];

int next[m];

int tot;

void add(int x,int y)

int hc[n];

int vc[m];

int nc[m];

int tc;

int n,m;

int dfn[n],low[n];

int stackk[n],ins[n],c[n];

int num=0;

int top;//指標

int cnt;//強聯通分量標號

int value2[n];

int value[n];

void tarjan(int x)

else if(ins[y])

}if(dfn[x]==low[x])

}}char ch[101][101];

int mer[n];

int cal(int x,int y)

bool judge(int x,int y)

bool mark[2000][2000];

int dp[n];

int main()

}for(int i=1;i<=tmp;++i)

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

tarjan(1);

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

for(int j=1;j<=m;++j)

}//cout

poj 2553強連通 縮點

先吐槽下,剛開始沒看懂題,以為只能是乙個連通圖0t0 題意 給你乙個有向圖,求g圖中從v可達的所有點w,也都可以達到v,這樣的v稱為sink.求這樣的v.解 求強連通 縮點。求所有出度為0的點即為要求的點。注意 可能有多個聯通分支。include include include define n 5...

poj 2186 強連通縮點

題意 有n只奶牛,奶牛有自己認為最受歡迎的奶牛。奶牛們的這種 認為 是單向可傳遞的,當a認為b最受歡迎 b不一定認為a最受歡迎 且b認為c最受歡迎時,a一定也認為c最受歡迎。現在給出m對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了...

模板 強連通縮點

直接給他縮點然後求新的圖的完整版 c2 u 表示縮點後的u點這個環上的點實際上是哪些 g3 u 表示縮點後的u點的出邊 還是一樣,要記得先處理入鏈。可以讓這個圖好看一點但是沒啥鳥用 入鏈可能會有一些特別的性質,當然假如入鏈沒有特別性質也可以直接縮點。不對其實直接縮點就可以了,入鏈還是新圖的入鏈,環是...