Пример #1
0
void initFlow(int _T)
{
	T= _T;
	cost.resize(T);
	cap.resize(T);
	for(int i=0;i<T;i++)
	{
		cost[i].resize(T);
		cap[i].resize(T);
	}
	deg.resize(T);
	adjList.resize(T);
}
Пример #2
0
/*void d1s2(VVI &inp){
    int val = 0;
    int n=inp.size();
    STACK sti,stj;
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
        }
        emptyStacks(inp,sti,stj,val);
    }
}
void d2s1(VVI &inp){
    int val = 0;
    int n=inp.size();
    STACK sti,stj;
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
        }
        emptyStacks(inp,sti,stj,val);
    }
}
void d2s2(VVI &inp){
    int val = 0;
    int n=inp.size();
    STACK sti,stj;
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
        }
        emptyStacks(inp,sti,stj,val);
    }
}*/
int main(){
    int n;
    char c;
    cin>>n;
    VVI inp;
    inp.resize(n);
    for(int i=0;i<n;i++){
        inp[i].resize(n);
        for(int j=0;j<n;j++){
            cin>>c;
            if(c=='.'){
                inp[i][j]=0;
            } else {
                inp[i][j]=1;
            }
        }
    }
    // horizontal scan;
    hs(inp);
    d1s1(inp); //s2(inp); d2s1(inp);d2s2(inp);
    for(int l=0;l<n;l++){
        for(int m=0;m<n;m++){
            cout<<inp[l][m];
            if(m<n-1){
                cout<<" ";
            }
        }
        cout<<endl;
    }

}
Пример #3
0
	void levelOrder(TreeNode* root, int iDeepth, VVI& result) {
		if (!root) return;
		if (iDeepth >= result.size())
			result.resize(iDeepth + 1);
		result[iDeepth].push_back(root->val);
		levelOrder(root->left, iDeepth + 1, result);
		levelOrder(root->right, iDeepth + 1, result);
	}
Пример #4
0
	vector<vector<int>> generate(int numRows) {
		VVI aiResult;
		aiResult.resize(numRows);
		for (int i = 0; i < numRows; ++i) {
			for (int j = 0; j <= i; ++j)
				aiResult[i].push_back((0 == j || i == j) ? 1 : (aiResult[i - 1][j] + aiResult[i - 1][j - 1]));
		}
		return aiResult;
	}
Пример #5
0
VVI transpose(VVI v){
	VVI result;
	result.resize(v.size());
	for(int i=0;i<result.size();i++)
		result[i].resize(v.size());
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v.size();j++){
			result[j][v.size() - 1 - i] = v[i][j];
		}
	}
	return result;
}
Пример #6
0
set<VT> LCSall(VT& A, VT& B)
{
  VVI dp;
  int n = A.size(), m = B.size();
  dp.resize(n+1);
  for(int i=0; i<=n; i++) dp[i].resize(m+1, 0);
  for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    {
      if(A[i-1] == B[j-1]) dp[i][j] = dp[i-1][j-1]+1;
      else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
    }
  set<VT> res;
  backtrackall(dp, res, A, B, n, m);
  return res;
}
Пример #7
0
int main()
{
    int N, M;

    while (cin >> N >> M)
    {
        int a, b;
    
        VVI w;
        VI mr;
        VI mc;
    
        w.resize(N);
    
        for (int i = 0; i < N; ++i)
        {
            w[i].resize(N);
            
            for (int j = 0; j < N; ++j)
            {
                w[i][j] = 0;
            }
        }
    
        for (int i = 0; i < M; ++i)
        {
            cin >> a >> b;
            w[a][b] = 1;
        }
        
        int numMatches = BipartiteMatching(w, mr, mc);
        
        if (numMatches == N)
        {
            cout << "YES\n";
        }
        else
        {
            cout << "NO\n";
        }
    }

    return 0;
}
Пример #8
0
VT LCS(VT& A, VT& B)
{
  VVI dp;
  int n = A.size(), m = B.size();
  dp.resize(n+1);
  for(int i=0; i<=n; i++) dp[i].resize(m+1, 0);
  
  for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    {
      if(A[i-1] == B[j-1]) dp[i][j] = dp[i-1][j-1]+1;
      else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
    }
    
  VT res;
  backtrack(dp, res, A, B, n, m);
  reverse(res.begin(), res.end());
  return res;
}
void solve(){
    sort(ALL(D));
    fuInit(k);
    sol.resize(k);
    int u,v;
    int cost = 0;
    int cnt = 0;
    for(auto e : D){
        u = get<1>(e); v = get<2>(e);
        //cout << get<0>(e) << " " << u << " " << v << endl;
        int ru=fuFind(u), rv=fuFind(v);
        if (ru != rv){
            fuUnion(ru,rv);
            cost += get<0>(e);
            cnt++;
            sol[u].PB(v);
            sol[v].PB(u);
        }
    }
    cost += full*(k-cnt);
    printf("%d\n",cost);
    DFS();
}
Пример #10
0
int main(){
//freopen("in.txt","r",stdin);
freopen("g1.in","r",stdin);
freopen("g1.out","w",stdout);
	int n;
	scanf("%d",&n);
	points.resize(n);
	V.resize(n);

	

	for(int i = 0; i < n; ++i){
		scanf("%d %d",&points[i].first,&points[i].second);
	}

	MST(points,V,n);

	memset(colors,-1,sizeof(colors));


	dfs(0);


	int ans = inf;

	for(int i = 0; i < n; ++i)
		for(int j = i+1; j < n; ++j){
			if(colors[i] == colors[j])
				ans = min(ans,dist(i,j));
		}

	printf("%.6lf\n",sqrt(0.0+ans)/2);
	for(int i = 0; i < n; ++i)
		printf("%d ",colors[i]+1);

	return 0;
}
Пример #11
0
int main()
{
	#ifndef ONLINE_JUDGE
		freopen ("in.txt", "r", stdin);
		// freopen ("out.txt", "w", stdout);
	#endif
	int n,m;
	VI P;
	VVI rooms;
	numTest(t)
	{
		cin>>n>>m;
		rooms.resize(n);
		P.resize(m);
		scana(P, m);
		REP(j,n)
		{
			int num;
			cin>>num;
			rooms[j].resize(num);
			scana(rooms[j], num);
			sort(rooms[j]);
		}
		// PR0(P,m);
		// REP(i,n)
		// 	PR0(rooms[i],sz(rooms[i]));
		ULL vol = 0;
		REP(i,m)
		{
			int s = sz(rooms[P[i]]);
			if(s != 0)
			{
				vol += rooms[P[i]][s-1];
				rooms[P[i]].pop_back();
			}
		}
Пример #12
0
void exact(VVI v) {
	if(v.size() == 0) {
		if(selected < glob[0].size() - 1) return;
		set<int> newelem;
		for(int i = 0; i < sol.size(); ++i) {
            newelem.insert(sol[i]);
        }
        sols.insert(newelem);
        /*
		cout<<"Solution:"<<endl;
        vector<int> sum(glob[0].size() - 1);
		for(int i = 0; i < sol.size(); ++i) {
            cout<<sol[i]<<endl;
            for(int j = 0; j < glob[sol[i]].size() - 1; ++j) {
                sum[j] += glob[sol[i]][j];
            }
        }
        for(int i = 0; i < sum.size(); ++i) {
            cout<<sum[i]<<" ";
        }
        cout<<endl;
        cout<<"---------"<<endl;
        */
        return;
    }

    for(int r = 0; r < v.size(); ++r) {
        if(v[r][0] == 1) {
            set<int> dc;
            set<int> dr;
            for(int j = 0; j < v[r].size() - 1; ++j) {
                if(v[r][j]) {
                    for(int i = 0; i < v.size(); ++i) {
                        if(v[i][j]) {
                            dr.insert(i);
                        }
                    }
                    dc.insert(j);
                }
            }

            /*
               set<int>::iterator it;
               cout<<"Banned columns: "<<endl;
               for(it = dc.begin(); it != dc.end(); ++it) {
               cout<<*it<<" ";
               }
               cout<<endl;
               cout<<"Banned rows: "<<endl;
               for(it = dr.begin(); it != dr.end(); ++it) {
               cout<<*it<<" ";
               }
               cout<<endl;
             */

            /*
               for(int i = 0; i < v[r].size() - 1; ++i) {
               if(v[r][i]) {
               dc.insert(i);
               for(int j = 0; j < v.size(); ++j) {
               if(v[j][i]) dr.insert(j);
               }
               }
               }
             */

            VVI nv;

            for(int i = 0; i < v.size(); ++i) {
                if(dr.count(i)) continue;
                nv.resize(nv.size() + 1);
                for(int j = 0; j < v[i].size(); ++j) {
                    if(!dc.count(j)) {
                        nv.back().push_back(v[i][j]);
                    }
                }
            }


            /*
               print(v);
               cout<<"Removing row "<<r<<endl;
               print(nv);
             */

            int sel = 0;
            for(int i = 0; i < v[r].size() - 1; ++i) {
                if(v[r][i]) ++sel;
            }

            selected += sel;
            sol.push_back(v[r].back());
            exact(nv);
            sol.pop_back();
            selected -= sel;
        }
    }
}
Пример #13
0
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;
}