Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define rep(i,k,n) for(long long int i=k;i<n;i++)
- #define fast ios_base::sync_with_stdio(false);cin.tie(NULL)
- #define read freopen("input.txt","r",stdin)
- #define write freopen("output.txt","w",stdout)
- #define D(x) cout << '>' << #x << ':' << x << endl
- #define DD(x,y) cout << '>' << #x << ':' << x << ' ' << #y << ':' << y << endl
- #define DDD(x,y,z) cout << '>' << #x << ':' << x << ' ' << #y << ':' << y << ' ' << #z << ':' << z << endl
- #define PI acos(-1)
- #define MP(x, y) make_pair(x, y)
- #define PB(x) push_back(x)
- #define ALL(p) p.begin(),p.end()
- #define CLR(p) memset(p, 0, sizeof(p))
- #define MEM(a, b) memset(a, (b), sizeof(a))
- #define ff first
- #define ss second
- #define sf scanf
- #define pf printf
- #define PII pair<int, int>
- #define ll long long int
- #define ull unsigned long long int
- inline int two(int n) { return 1 << n; }
- inline int test(int n, int b) { return (n>>b)&1; }
- inline void set_bit(int & n, int b) { n |= two(b); }
- inline void unset_bit(int & n, int b) { n &= ~two(b); }
- inline int last_bit(int n) { return n & (-n); }
- inline int ones(int n) { int res = 0; while(n && ++res) n-=n&(-n); return res; }
- template < class T > inline T gcd(T a, T b) {while(b) { a %= b; swap(a, b); } return a;}
- template < class T > inline T bigmod(T p, T e, T M){
- ll ret = 1;
- for(; e > 0; e >>= 1){ if(e & 1) ret = (ret * p) % M; p = (p * p) % M; }
- return (T)ret;
- }
- template < class T > inline T power(T a, T n) {
- if(n==0) return 1;
- if(n==1) return a;
- T R = power(a,n/2);
- return (n%2==0) ? R*R : R*a*R;
- }
- const int MAX = 107;
- int N, E;
- pair<int, pair<int, int> > edges[MAX];
- int parent[MAX];
- int total_cost;
- void init()
- {
- rep(i,0,MAX) parent[i] = i;
- total_cost = 0;
- }
- int Find(int u)
- {
- if(u != parent[u]) u = Find(parent[u]);
- return parent[u];
- }
- void Union(int u, int v)
- {
- int x = Find(u);
- int y = Find(v);
- parent[x] = y;
- }
- void MST_Kruskal()
- {
- for(int i = 0; i<E; i++)
- {
- int u = edges[i].second.first;
- int v = edges[i].second.second;
- int w = edges[i].first;
- cout << u << " " << v << " ---> " << w << endl;
- if(Find(u) != Find(v))
- {
- total_cost += w;
- Union(u, v);
- }
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- read;
- write;
- #endif
- init();
- cin >> N >> E;
- rep(i,0,E)
- {
- int u,v,w;
- cin >> u >> v;
- w = u*u + v*v;
- edges[i] = {w, {u,v}};
- }
- sort(edges, edges+E);
- MST_Kruskal();
- cout << total_cost << endl;
- return 0;
- }
- |E| = n(n-1)/2 = (n^2 - n)/2
- O(n^2)
- O(Cn^e + nC) = O(n^e)
- E = O(n^2)
- O(V + ElogN) -> adjcency list -> O(n + n^2logN) = O(N^2logN)
- O(N^2 * logN) -> adjcency matrix -> O(N * NlogN) = O(N^2logN)
- dijstra(G,S):
- for each v in G: - O(N)
- v.dist = inf
- v.parent = -1
- S.dist = 0 - O(1)
- priority_queue pq
- pq.push({0, s.dist})
- while(pq.size != 0): - O(N)
- u = pq->top->node
- pq->pop - O(logN)
- if u.visted == true then continue
- u.visited == true
- for each vertex v in G: - O(N)
- if (u,v) belongs to E:
- if u.dist + cost(u,v) < v.dist:
- v.dist = u.dist + cost(u,v)
- v.parent = u
- pq.push(node(v.dist, v)) - O(logN)
- total time complexity:
- = O(V) + O(1) + O((V*V) * logV)
- = O(V^2 logV)
- = O(N^2 logN)
- 2*i
- 2*i + 1
- pair<int, int> p[5];
- p = make_pair(4,5);
- 1 2 3 4 5
- init 1 2 3 4 5
- 1,2 2 3 3 4 5
- 1 2 3
Add Comment
Please, Sign In to add comment