Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 760;
- int parent[N];
- int siz[N];
- vector<pair<pair<int,int>,long long> > elist;
- vector<pair<int,int> > path[N];
- void make_set(int v)
- {
- parent[v] = v;
- siz[v] = 1;
- }
- int find_set(int v)
- {
- if(v == parent[v])
- return v;
- return parent[v] = find_set(parent[v]);
- }
- void union_set(int a,int b)
- {
- a = find_set(a);
- b = find_set(b);
- if(a != b)
- {
- if(siz[a] < siz[b])
- swap(a,b);
- parent[b] = a;
- siz[a] +=siz[b];
- siz[b] = 0;
- }
- }
- /*int vis[N];
- int vid = 1;
- int minimum;*/
- int highwaycnt = 0;
- /*void dfs(int idx,int mn,int target)
- {
- //printf("%d %d %d\n",idx,mn,target);
- if(idx == target)
- {
- minimum = mn;
- return;
- }
- vis[idx] = vid;
- for(int i = 0; i < path[idx].size(); i++)
- if(vis[path[idx][i].first] != vid)
- dfs(path[idx][i].first,min(mn,path[idx][i].second),target);
- return;
- }*/
- bool cmp(pair<pair<int,int>,long long> a,pair<pair<int,int>,long long> b)
- {
- return a.second < b.second;
- }
- //bool flag = false;
- void mst()
- {
- sort(elist.begin(),elist.end(),cmp);
- for(int i = 0; i < elist.size(); i++)
- {
- int u = elist[i].first.first,v = elist[i].first.second;
- //int cost = elist[i].second;
- /*if(u == 1 && v == 6)
- printf("1 %I64d\n",elist[i].second);
- if(u == 2 && v == 8)
- printf("2 %I64d\n",elist[i].second);*/
- if(find_set(u) != find_set(v))
- {
- union_set(u,v);
- printf("%d %d\n",u,v);
- highwaycnt++;
- //path[u].push_back(make_pair(v,cost));
- //path[v].push_back(make_pair(u,cost));
- }
- }
- return;
- }
- void init()
- {
- for(int i = 0; i < N; i++)
- make_set(i);
- elist.clear();
- //flag = false;
- highwaycnt = 0;
- //for(int i = 0; i < N; i++)
- // path[i].clear();
- //memset(vis,0,sizeof vis);
- }
- long long calc(int x1,int y1, int x2,int y2)
- {
- return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
- }
- bool cmp2(int i, int j)
- {
- return i > j;
- }
- int t;
- int n,m;
- int x,y;
- map<int,pair<int,int> > cities;
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- #ifndef ONLINE_JUDGE
- //freopen("input.txt", "r", stdin);
- //freopen("out.txt", "w", stdout);
- #endif // ONLINE_JUDGE
- scanf("%d",&t);
- while(t--)
- {
- init();
- scanf("%d",&n);
- int cnt = 1;
- for(int i = 0; i < n; i++)
- {
- scanf("%d%d",&x,&y);
- cities[cnt++] = {x,y};
- }
- for(map<int,pair<int,int> >::iterator it1 = cities.begin(); it1 != cities.end();it1++)
- for(map<int,pair<int,int> >::iterator it2 = cities.begin(); it2 != cities.end(); it2++)
- if(it1->first < it2->first)
- elist.push_back(make_pair(make_pair(it1->first,it2->first),calc(it1->second.first,it1->second.second,it2->second.first,it2->second.second)));
- scanf("%d",&m);
- for(int i = 0; i < m; i++)
- {
- scanf("%d%d",&x,&y);
- union_set(x,y);
- }
- if(highwaycnt == n-1)
- puts("No new highways need");
- else
- mst();
- //printf("%I64d",calc(1,5))
- if(t)
- puts("");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement