示例#1
0
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();
}
示例#2
0
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;
		}
	}
}
示例#3
0
    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);
            }
    }
示例#5
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;
 }
示例#6
0
文件: main.cpp 项目: aravindkanna/BTP
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;
}