2014-01-14 60 views
1

我想從ACM Timus解決以下問題: http://acm.timus.ru/problem.aspx?space=1&num=1242,但我不知道如何正確讀取輸入。我正在使用兩個while循環。一旦一個字符串寫入輸入,第一個終止,但第二個在此之後不起作用。這是我的代碼:C++輸入難度

#include <iostream> 
#include <vector> 
using namespace std; 



struct Pair 
{ 
    void AddParent(int a) 
    { parents.push_back(a); } 
    void AddChild(int a) 
    { children.push_back(a);} 
    vector<int> parents; 
    vector<int> children; 
}; 

vector<bool> visited; 
vector<Pair> graph; 

void DFS1(int n) 
{ 
    visited[n] = true; 
    for(int i = 0 ; i < graph[n].parents.size() ; i++) 
    { 
     int t = graph[n].parents[i]; 
     if(!visited[t]) 
      DFS1(t); 
    } 
    return; 
} 

void DFS2(int n) 
{ 
    visited[n] = true; 
    for(int i = 0 ; i < graph[n].children.size() ; i++) 
    { 
     int t = graph[n].children[i]; 
     if(!visited[t]) 
      DFS2(t); 
    } 
    return; 
} 


int main() 
{ 
    int n; 
    cin >> n; 
    graph.resize(n); 
    visited.resize(n); 
    int a,b,c; 
    vector<int> victim; 

//////////////////////////////// 
    while(cin >> a && cin >> b) 
    { a--;b--; 
     graph[a].AddParent(b); 
     graph[b].AddChild(a); 
    } 

    cin.clear(); 
    cin.ignore(); 

    while(cin >> c) 
    { 
     victim.push_back(c); 
    } 

////////////////////////////////  

    for(int i = 0 ; i < victim.size() ; i++) 
     if(!visited[victim[i]]){ 
      DFS1(victim[i]); 
      DFS2(victim[i]); 
     } 


    bool vis = false; 
    for(int i = 0 ; i < n ; i++) 
     if(!visited[i]) 
     { 
      vis = true; 
      cout << i + 1 << " "; 
     } 
     if(!vis) 
      cout << 0; 

return 0; 
} 

回答

2

在進入第二個while循環之前,您應該清除輸入流cin。

while(cin >> a && cin >> b) 
    { a--;b--; 
     graph[a].AddParent(b); 
     graph[b].AddChild(a); 
    } 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    while(cin >> c) 
    { 
     victim.push_back(c); 
    } 

,幷包括頭限制

Why would we call cin.clear() and cin.ignore() after reading input?

+0

你寫了我的話! :) – Mike

+0

它仍然無法正常工作。我已添加完整的代碼。 – user1978522

+0

@ user1978522函數ignore將作爲第一個參數的字符數忽略。默認情況下,它被設置爲1.因此,如果您輸入的字符串超過1個字符,則該函數將失敗。我已經更改了代碼以取得最大限制。 – sajas