0

私はしばらくの間STLを使用してきましたが、今日、このエラーが発生しました。

error: no class template named 'rebind' in 'class std::vector<int, std::allocator> >'

次のプログラムで:

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#include <bitset>
#include <climits>
#include <stack>
#include <cctype>
#include <sstream>
using namespace std;

vector<int, vector<int> > G[2000005];
vector<int, vector<int> > Grev[2000005];
int f[2000005], order[2000005], leader[2000005], t = 0, parent = 0;
bool explored[2000005];

void dfs_reverse(int i) {
    explored[i] = true;
    for(vi::iterator it=G[i].begin(); it != G[i].end(); it++)
        if(!explored[*it])
            dfs_reverse(*it);
    t++;
    f[i] = t;
}

void dfs(int i) {
    explored[i] = true;
    leader[i] = parent;
    for(vi::iterator it=G[i].begin(); it != G[i].end(); it++)
        if(!explored[*it])
            dfs(*it);
}

int main()  {
    int N, i, j, u, v;

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    scanf("%d", &N);
    for(i=0; i<N; i++)  {
        scanf("%d %d", &u, &v);
        if(u > 0)   {
            if(v > 0)   {
                G[N + u].push_back(v); G[N + v].push_back(u);
                Grev[v].push_back(N + u); Grev[u].push_back(N + v);
            } else  {
                G[N + u].push_back(N - v); G[-v].push_back(u);
                Grev[N-v].push_back(N+u); Grev[u].push_back(-v);
            }
        } else  {
            if(v > 0)   {
                G[-u].push_back(v); G[N + v].push_back(N - u);
                Grev[v].push_back(-u); Grev[N-u].push_back(N+v);
            } else  {
                G[u].push_back(N - v); G[-v].push_back(N - u);
                Grev[N-v].push_back(u); Grev[N-u].push_back(-v);
            }
        }
    }

    memset(explored, false, 2000005*sizeof(bool));
    for(i=2*N; i>0; i--)    {
        if(!explored[i])
            dfs_reverse(i);
        order[f[i]] = i;
    }

    memset(explored, false, 2000005*sizeof(bool));
    for(i=2*N; i>0; i--)    {
        if(!explored[order[i]]) {
            parent = order[i];
            dfs(order[i]);
        }
    }

    for(i=1; i<=N; i++)
        if(leader[i] == leader[N+i])
            break;

    if(i <= N)
        printf("Unsatisfiable\n");
    else    printf("Satisfiable\n");

    return 0;
}

強連結成分を見つけるためのKosarajuの2パスアルゴリズムを使用して2SAT問題を解決しようとしています。基本的に、大きなグラフ(2000000ノード)にメモリを割り当てる必要があります。ベクトル>G[2000005]でこれを行っていますが、上記のエラーが発生します。このエラーを解決するにはどうすればよいですか?

4

1 に答える 1

5

問題はvector<int, vector<int>です。2番目のテンプレート引数, vector<int>は意味がありません。あなたが意図したstd::vector<std::pair<int, vector<int> >std::map<int, std::vector<int>

于 2013-01-23T10:23:30.433 に答える