Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.25 KB | None | 0 0
  1.  
  2. #define _CRT_SECURE_NO_WARNINGS
  3.  
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. #define loop(i, n) for(int i=0; i<n; i++)
  7. #define int long long
  8. const int INF = 2e18 + 7;
  9. const int MAXN = 4e5 + 5;
  10. vector<bool> used(MAXN);
  11. vector<int> g[MAXN], tin(MAXN), fup(MAXN), gg(MAXN);
  12. int timerr;
  13. vector<pair<int, int> > edge;
  14. vector<int> tt(MAXN);
  15. void dfs(int u, int p) {
  16. used[u] = 1;
  17. tin[u] = fup[u] = timerr++;
  18. tt[fup[u]]++;
  19. for (auto i : g[u]) {
  20. if (i == p) continue;
  21. if (used[i]) {
  22. tt[fup[u]]--;
  23. fup[u] = min(fup[u], tin[i]);
  24. tt[fup[u]]++;
  25. }
  26. else {
  27. dfs(i, u);
  28. tt[fup[u]]--;
  29. fup[u] = min(fup[i], fup[u]);
  30. tt[fup[u]]++;
  31. if (fup[i] > tin[u]) {
  32. edge.push_back({ u, i });
  33. }
  34. }
  35. }
  36. }
  37. signed main() {
  38. int n, m;
  39. cin >> n >> m;
  40. for (int i = 0; i < m; i++) {
  41. int u, v;
  42. cin >> u >> v;
  43. u--; v--;
  44. g[u].push_back(v);
  45. g[v].push_back(u);
  46. }
  47. dfs(0, -1);
  48.  
  49. for (auto i : edge) {
  50. gg[fup[i.first]]++;
  51. gg[fup[i.second]]++;
  52. }
  53. int ans = 1, ch = 0;
  54. for (int i = 0; i < n; i++) {
  55. if (gg[i] == 1) {
  56. ch++;
  57. ans = (ans * tt[i]) % 1000000007;
  58. }
  59. }
  60. if (ch == 0) cout << 1 << " " << n;
  61. else cout << ch << " " << ans;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement