題意:
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 先吐槽下,剛開始沒看懂題,以為只能是乙個連通圖0t0 題意 給你乙個有向圖,求g圖中從v可達的所有點w,也都可以達到v,這樣的v稱為sink.求這樣的v.解 求強連通 縮點。求所有出度為0的點即為要求的點。注意 可能有多個聯通分支。include include include define n 5... 題意 有n只奶牛,奶牛有自己認為最受歡迎的奶牛。奶牛們的這種 認為 是單向可傳遞的,當a認為b最受歡迎 b不一定認為a最受歡迎 且b認為c最受歡迎時,a一定也認為c最受歡迎。現在給出m對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了... 直接給他縮點然後求新的圖的完整版 c2 u 表示縮點後的u點這個環上的點實際上是哪些 g3 u 表示縮點後的u點的出邊 還是一樣,要記得先處理入鏈。可以讓這個圖好看一點但是沒啥鳥用 入鏈可能會有一些特別的性質,當然假如入鏈沒有特別性質也可以直接縮點。不對其實直接縮點就可以了,入鏈還是新圖的入鏈,環是...poj 2553強連通 縮點
poj 2186 強連通縮點
模板 強連通縮點