USACO network of school 强连通分量
生活随笔
收集整理的這篇文章主要介紹了
USACO network of school 强连通分量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個題的意思是有一個有向圖, 每個頂點可以發送軟件到與其相連的頂點上, 現在問1,至少發送給幾個頂點能滿足所有頂點都收到軟件, 2:如果想讓這個圖變成強連通圖,至少添幾條邊。 ?特例是給定的圖是一個強連通圖的話答案是1, 0. 一般情況下我們先將這個圖的強連通分量求出來縮成一個點然后統計入度為0的點和出度為0的點的個數, 答案一就是入度為0的點的個數, 答案就是他們兩個之間的最大值。代碼如下:
/*ID: m1500293LANG: C++PROG: schlnet */ #include <cstdio> #include <cstring> #include <algorithm> #include <vector>using namespace std; const int max_v = 120;struct Scc {int V; //圖的頂點數vector<int> G[max_v]; //原始圖vector<int> rG[max_v]; //反向邊的圖vector<int> vs; //后序遍歷頂點列表bool used[max_v]; //訪問標記int cmp[max_v]; //所屬強連通分量的拓撲排序void init(){for(int i=0; i<=V; i++) G[i].clear(), rG[i].clear();}void add_edge(int from, int to){G[from].push_back(to);rG[to].push_back(from);}void dfs(int v){used[v] = true;for(int i=0; i<G[v].size(); i++)if(!used[G[v][i]]) dfs(G[v][i]);vs.push_back(v);}void rdfs(int v, int k){used[v] = true;cmp[v] = k;for(int i=0; i<rG[v].size(); i++)if(!used[rG[v][i]]) rdfs(rG[v][i], k);}int scc(){memset(used, 0, sizeof(used));vs.clear();for(int v=1; v<=V; v++)if(!used[v]) dfs(v);memset(used, 0, sizeof(used));int k = 1;for(int i=vs.size()-1; i>=0; i--)if(!used[vs[i]]) rdfs(vs[i], k++);return k-1;} }ss; int num; //強連通分量的個數 int in[110], out[110]; int main() {freopen("schlnet.in", "r", stdin);freopen("schlnet.out", "w", stdout);int N;scanf("%d", &N);ss.V = N;ss.init();for(int i=1; i<=N; i++){int t;scanf("%d", &t);while(t != 0){ss.add_edge(i, t);scanf("%d", &t);}} // printf("%d\n", ss.scc());num = ss.scc();if(num == 1){printf("1\n0\n");return 0;}for(int u=1; u<=N; u++) //u->vfor(int j=0; j<ss.G[u].size(); j++){int v = ss.G[u][j];int uu=ss.cmp[u], vv=ss.cmp[v];if(uu != vv){in[vv]++;out[uu]++;}}int in_0_num=0, out_0_num=0;for(int i=1; i<=num; i++){if(!in[i]) in_0_num++;if(!out[i]) out_0_num++;}printf("%d\n%d\n", in_0_num, max(in_0_num, out_0_num));return 0; }?
轉載于:https://www.cnblogs.com/xingxing1024/p/5180641.html
總結
以上是生活随笔為你收集整理的USACO network of school 强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Latex 数学符号表
- 下一篇: 法语备考资料