USACO Section 2.3: Controlling Companies

这题的dp里的check里的函数要考虑k control i control j和i control j control k的情况

 1 /*

 2 ID: yingzho1

 3 LANG: C++

 4 TASK: concom

 5 */

 6 #include <iostream>

 7 #include <fstream>

 8 #include <string>

 9 #include <map>

10 #include <vector>

11 #include <set>

12 #include <algorithm>

13 #include <stdio.h>

14 #include <queue>

15 #include <cstring>

16 #include <cmath>

17 

18 using namespace std;

19 

20 ifstream fin("concom.in");

21 ofstream fout("concom.out");

22 

23 int N;

24 bool c[110][110];

25 int d[110][110];

26 

27 void check(int i, int j) {

28     c[i][j] = true;

29     //cout << "c[" << i << "][" << j << "] = true" << endl;

30     for (int k = 0; k <= 100; k++) d[i][k] += d[j][k];

31     for (int k = 0; k <= 100; k++)

32         if (!c[i][k] && d[i][k] > 50) check(i, k);

33     for (int k = 0; k <= 100; k++)

34         if (c[k][i] && !c[k][j]) check(k, j);

35 }

36 

37 int main()

38 {

39     fin >> N;

40     for (int i = 0; i < N; i++) {

41         int a, b, c;

42         fin >> a >> b >> c;

43         d[a][b] = c;

44     }

45     for (int i = 0; i <= 100; i++) c[i][i] = 1;

46     for (int i = 1; i <= 100; i++) {

47         for (int j = 1; j <= 100; j++) {

48             if (!c[i][j] && d[i][j] > 50) check(i, j);

49         }

50     }

51     for (int i = 1; i <= 100; i++) {

52         for (int j = 1; j <= 100; j++) {

53             if (i != j && c[i][j]) fout << i << " " << j << endl;

54         }

55     }

56 

57     return 0;

58 }

 

你可能感兴趣的:(USACO)