【CCF】高速公路
阿新 • • 發佈:2019-01-06
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; }