void CalcMatrix(const vector<CompositeData> data, VVI & RM, VVI & DM, VS & deci_val) { if (data.size() == 0 ) { cerr << "Input data is empty!" << endl; exit(-1); } unsigned int i, j; //Calc Relation Matrix RM.clear(); VI vbTmp(data.size(), 0); RM.insert(RM.begin(), data.size(), vbTmp); for (i = 0; i < data.size(); ++i) { for (j = 0; j < data.size(); ++j) { if (data[i] == data[j]) RM[i][j] = 1; } RM[i][i] = 1; } //Calc Relation Matrix STR2VI_MAP DMap; STR2VI_MAP::iterator it; for (i = 0; i < data.size(); ++i) { it = DMap.find(data[i].d); if (it == DMap.end()) { VI tmp; tmp.push_back(i); DMap.insert(STR2VI_MAP::value_type(data[i].d, tmp)); } else { ((*it).second).push_back(i); } } //DM: n * d //DMap.size() = d DM.clear(); VI viTmp(DMap.size(), 0); DM.insert(DM.begin(), data.size(), viTmp); // cout << DM.size() << "\t" << DM[0].size() << endl; for (i = 0, it = DMap.begin(); it != DMap.end(); ++it, ++i) { deci_val.push_back((*it).first); for (j = 0; j < (*it).second.size(); ++j) { DM[(*it).second[j]][i] = 1; } } DMap.clear(); }
void CalcOmegaMatrix(const VVI & RM, const VVI & DM, VVI & OmegaM) { if (RM.size() == 0 || DM.size() == 0) { cerr << "Size of relation matrix and decison matrix is 0 !" << endl; exit(-1); } //OmegaM: n * d OmegaM.clear(); VI viTmp(DM[0].size(), 0); OmegaM.insert(OmegaM.begin(), RM.size(), viTmp); // cout << OmegaM.size() << "\t" << OmegaM[0].size() <<endl; unsigned int i, j, k; STR2VI_MAP::iterator it; int sum = 0; for (i = 0; i < RM.size(); ++i) { for (j = 0; j < DM[0].size(); ++j) { sum = 0; for (k = 0; k < DM.size(); ++k) { sum += RM[i][k] * DM[k][j]; } OmegaM[i][j] = sum; } } }
bool multi(VVI & x, VVI & y, VVI & z) { int mx = x.size(); int my = y.size(); if (mx == 0 || my == 0) return false; int nx = x[0].size(); int ny = y[0].size(); if (nx == 0 || ny == 0) return false; //cout << "mx: " << mx << endl; //cout << "my: " << my << endl; //cout << "nx: " << nx << endl; //cout << "ny: " << ny << endl; if (nx != my) return false; z.clear(); for (int i = 0; i < mx; i++) { z.push_back(VI(ny, 0)); for (int j = 0; j < ny; j++) { double sum = 0; for (int k = 0; k < my; k++) { sum += (double)x[i][k] * (double)y[k][j]; } if (sum > INT_MAX || sum < INT_MIN) return false; z[i][j] = (int)sum; } } return true; }
void buildBCC () { idx = VI(n, -1), low = VI(n); cutVertices.clear(); bridges.clear(); st.clear(); components.clear(); totalComponents++; for (int i = 0; i < n; i++) if (idx[i] == -1) { DFS(make_pair(i, -1), 0); } }
bool add(VVI & x, VVI & y, VVI & z) { int mx = x.size(); int my = y.size(); if (mx == 0 || my == 0) return false; int nx = x[0].size(); int ny = y[0].size(); if (nx == 0 || ny == 0) return false; //cout << "mx: " << mx << endl; //cout << "my: " << my << endl; //cout << "nx: " << nx << endl; //cout << "ny: " << ny << endl; if (mx != my || nx != ny) return false; z.clear(); for (int i = 0; i < mx; i++) { z.push_back(VI(nx, 0)); for (int j = 0; j < nx; j++) { double tmp = (double)x[i][j] + (double)y[i][j]; if (tmp > INT_MAX || tmp < INT_MIN) return false; z[i][j] = (int)tmp; } } return true; }
int main() { //omp_set_num_threads(4); cout << "Scanning Started..." << endl; scanf("%d %d %d %d %d",&n,&m,&s,&D,&t); rootN = 0; while(rootN*rootN<n) rootN++; tmp.clear(); tmp.resize(n); for(int i=0; i<m; i++) { int u,v; scanf("%d %d",&u,&v); u--; v--; G[u].PB(v); tmp[u].PB(v); } for(int i=0; i<s; i++) { int x; scanf("%d",&x); x--; S.PB(x); } cout << "Scanning done" << endl; //test_recursive(); double start = omp_get_wtime(); VVI ans; if(D <= t && D <= rootN) { cout << "Case 1 : D <= t and D <= root" << endl; B2::solve(G,n,m,s,D,S,ans); } else if(t >= rootN) { cout << "Case 2 : t >= sqrt(N)" << endl; R1::solve(n,m,s,D,S,G,ans,rootN); } else if(s >= ceil(n/t)) { cout << "Case 3 : s >= ceil(n / t)" << endl; R2::solve(n,m,s,D,S,G,ans,ceil(n/t)); } else if(D <= t*t) { cout << "Case 4 : D <= t*t" << endl; R3::solve(n,m,s,D,S,G,ans,ceil(n/t)); } else { cout << "Case 5 : Else" << endl; R3::solve(n,m,s,D,S,G,ans,ceil(n/t),1,ceil(n/(t*t))); } double end = omp_get_wtime(); printf("N = %d, E = %d, S = %d, D = %d\n",n,m,s,D); if(n <= brute_max) { cout << "Starting Bruteforce..." << endl; VVI dist(n,VI(n,0)); for(int i=0; i<n; i++) { dist[i][i] = 1; for(auto v:tmp[i]) dist[i][v] = 1; } //print(dist); double start_brute = get_cpu_time(); int brute_cnt = transitive_closure(dist,n); double end_brute = get_cpu_time(); int cnt = 0; for(int i=0; i<SZ(S); i++) cnt += SZ(ans[S[i]]); double acc = (cnt*1.0)/brute_cnt; acc *= 100; printf("\nAccuracy: %lf\n",acc); printf("Brute Time: %lf\n",end_brute - start_brute); //print(dist); /* for(int i=0; i<n; i++) for(auto v:ans[i]) assert(dist[i][v]==1); */ cout << "Bruteforce done" << endl; } printf("Time: %lf\n",end-start); //printf("Graph:\n"); //print(tmp); //printf("Transitive Closure:\n"); //print(ans); return 0; }