CCF又一个编译出错点:vector<vector<int>> vvi;
在VS2010里面可以通过。
以下代码编译出错,仅供参考。
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
vector<vector<int>> vvi;
int stack[10001] = {0};
int inStack[10001] = {0};
int DFN[10001] = {0};
int LOW[10001] = {0};
int BELONG[10001] = {0};
int stackP = 0;
int dIndex = 0;
int answer = 0;
int bcnt = 0;
int edgen,noden;
void tarjan(int index){
inStack[index] = 1;
stack[stackP++] = index;
DFN[index] = LOW[index] = ++dIndex;
for(vector<int>::iterator vit = vvi[index].begin();vit!=vvi[index].end();++vit){
if(!DFN[*vit]){
tarjan(*vit);
if(LOW[*vit] < LOW[index]){
LOW[index] = LOW[*vit];
}
}
else if(inStack[*vit] && DFN[*vit] < LOW[index]){
LOW[index] = DFN[*vit];
}
}
if(DFN[index] == LOW[index]){
int sum = 0,j;
++bcnt;
do{
j = stack[--stackP];
inStack[j] = 0;
BELONG[j] = bcnt;
++sum;
}while(index != j);
if(sum != 0){
answer += (sum * (sum -1) )/2;
}
}
}
void solve(){
int i;
for(i=-1;++i<noden;){
if(!DFN[i]){
tarjan(i);
}
}
}
int main(){
cin>>noden>>edgen;
vvi.resize(noden);
int i,edge_s,edge_e;
for(i=-1;++i<edgen;){
cin>>edge_s>>edge_e;
vvi[edge_s-1].push_back(edge_e-1);
}
solve();
cout<<answer<<endl;
return 0;
}