Pagini recente » Cod sursa (job #2327158) | Cod sursa (job #1329362) | Cod sursa (job #2081046) | Cod sursa (job #1575663) | Cod sursa (job #2565351)
//#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
ifstream cin("autobuze3.in");
ofstream cout("autobuze3.out");
unordered_set <int> um;
deque<int> topo;
int tata[200005],sz[200005],szz[200005],autobuz[200005],n,m,legitinv[200005];
long long cost;
int f[200005];
vector<int> graf[200005],legit[200005];
vector<pair<int,int> > v[200005];
pair<int,pair<int,int> > edge[400005];
int daddy(int a){
if(tata[a]==a){
return a;
}
tata[a]=daddy(tata[a]);
return tata[a];
}
void unite(int a,int b,int c){
if(daddy(a)!=daddy(b)){
if(sz[tata[a]]>sz[tata[b]]){
tata[tata[b]]=tata[a];
sz[tata[a]]+=sz[tata[b]];
}
else{
tata[tata[a]]=tata[b];
sz[tata[b]]+=sz[tata[a]];
}
cost+=c;
graf[a].push_back(b);
graf[b].push_back(a);
}
}
void dfs(int nod){
um.insert(nod);
for(auto u:graf[nod]){
if(um.find(u)==um.end()){
dfs(u);
legit[nod].push_back(u);
f[nod]++;
}
}
}
void calc_size(int nod){
szz[nod]=1;
for(auto u:legit[nod]){
calc_size(u);
szz[nod]+=szz[u];
}
}
void find_fii(int nod,int a1,int a2){
cout<<"Move "<<nod<<" "<<a1<<" "<<a2<<"\n";
for(auto u:legit[nod]){
find_fii(u,a1,a2);
}
}
void AFIS_MOVE(int a1,int a2){
find_fii(a1,autobuz[a1],autobuz[a2]);
}
void MOVE(int nod){
int maxi=-1,k;
for(auto u:legit[nod]){
cout<<"Drive "<<autobuz[u]<<" "<<u<<" "<<nod<<"\n";
if(szz[u]>maxi){
maxi=szz[u];
k=u;
}
}
if(maxi==-1){
return;
}
//AFIS_MOVE(nod,autobuz[k]);
cout<<"Move "<<nod<<" "<<nod<<" "<<autobuz[k]<<"\n";
for(auto u:legit[nod]){
if(k==u){
continue;
}
AFIS_MOVE(u,k);
}
autobuz[nod]=autobuz[k];
}
int main()
{
int t,a,b,c;
cin>>t;
while(t--){
cin>>n>>m;
cost=0;
um.clear();
for(int i=1;i<=n;i++){
autobuz[i]=i;
tata[i]=i;
sz[i]=1;
v[i].resize(0);
legit[i].resize(0);
graf[i].resize(0);
legitinv[i]=0;
f[i]=0;
szz[i]=0;
}
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
v[a].push_back(make_pair(b,c));
edge[i]=make_pair(c,make_pair(a,b));
}
sort(edge+1,edge+m+1);
for(int i=1;i<=m;i++){
unite(edge[i].second.first,edge[i].second.second,edge[i].first);
}
cout<<cost<<"\n";
int root=1;
dfs(root);
for(int i=1;i<=n;i++){
if(f[i]==0){
topo.push_front(i);
}
}
for(int i=1;i<=n;i++){
//cout<<i<<"->";
for(auto u:legit[i]){
//cout<<u<<" ";
legitinv[u]=i;
}
//cout<<"\n";
}
calc_size(root);
//cout<<"gigel\n";
while(topo.empty()==false){
int x=topo.front();
topo.pop_front();
MOVE(x);
f[legitinv[x]]--;
if(f[legitinv[x]]==0){
topo.push_back(legitinv[x]);
}
}
cout<<"Gata\n";
}
return 0;
}