鏈結 :
題意 :多公尺諾骨牌 如果有邊存在u -> v 說明u倒了v也自動倒了。問最少需要手動推到幾個。
如果一些牌屬於同乙個強連通分量 那麼任意推倒其中之一就算全部推倒。可以強連通縮點之後 推倒的一定是沒有入度的牌。
注意 這題不能直接判斷所有入度為0的點有幾個,因為可能存在入度都不為0 但是存在多個強連通分量。比如
n = 6, m = 6
1 -> 2,
2 -> 3,
3 -> 1,
4 -> 5,
5 -> 6,
6 -> 4.
雖然沒有入度為0的點 但是需要推2次。
#pragma comment(linker, "/stack:10240000,10240000")
#include #include #include #include #include #include #include #include #include #include #include #include #define mod 4294967296
#define max 0x3f3f3f3f
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
#define sz(x) ((int)ans.size())
#define make make_pair
#define infl 0x3f3f3f3f3f3f3f3fll
#define mem(a) memset(a, 0, sizeof(a))
const double pi = acos(-1.0);
const double eps = 1e-9;
const int n = 100005;
const int m = 20005;
typedef long long ll;
using namespace std;
int n, m;
vector g[n];
int pre[n], low[n], scc[n], dfs_clock, scc_cnt;
stack s;
int t;
void dfs(int u) else if(scc[v] == 0)
}if(low[u] == pre[u])
}}void find_scc()
}int vis[n];
int main()
find_scc();
mem(vis);
for(int u = 0; u < n; u++) }}
int cnt = 0;
//cout << scc_cnt << endl;
for(int i = 1; i <= scc_cnt; i++)
cout << cnt << endl;
}return 0;
}
uva 11504 Dominos動態分配記憶體
這題是給定許多骨牌,以及相對應的關係,a b 就表示a 倒之後會推倒 b 題目要求說最少推倒幾個就可以使骨牌全部倒 view code include include include include include using namespace std define max 100009 defi...
強連通分量入門 UVA 11324
強連通分量就是有向圖中任意兩點可以互相到達的點構成的連通分量,演算法很多,簡單易懂的tarjan提出的scc演算法的核心思路就是 乙個點的後代出現能連到的最早的點就是自身時,這個點便和這些後代構成了強連通圖,具體的實現和割點或者雙連通的演算法都是很相似的,核心部分都是有dfs實現的。題目描述 在有向...
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...