アルゴリズムの練習--ウイルスを探す


テーマはネットで探して、コードは自分で書いたのです
説明
HiちゃんとHoちゃんの学校のキャンパスネットワークがハッカーに侵入され、ウイルスが投入された.この件は校内BBSですぐにみんなの討論を引き起こして、もちろんHiとHoも参加しました.皆さんがそれぞれ知っていることから、HiさんとHoさんは以下の情報を整理しました.
  • キャンパスネットワークのメインは、N個のノード(番号1..N)からなり、これらのノードの間には一方向のネットワーク接続がある.ネットワーク接続(u,v)がノードuとノードvとをリンクしている場合、ノードuはノードvに情報を送信することができるが、ノードvはこのリンクを介してノードuに情報を送信することができない.
  • ウイルスに感染したばかりの時、キャンパスネットワークはすぐにいくつかのネットワークリンクを切断し、ちょうど残りのネットワーク接続にループが存在しないようにし、ノードの繰り返し感染を避けた.つまり,ノードiから拡散したウイルスは,必ずノードiに戻らない.
  • ウイルスがノードに感染した場合、ノードが感染しているかどうかを確認するのではなく、自分のコピーをすべての隣接ノードに直接送信し、それ自体が現在のノードに残ります.したがって、1つのノードに複数のウイルスが存在する可能性があります.
  • ハッカーが最初にKノードにそれぞれウイルスを投入したことが分かった.

  • たとえば,部分ネットワーク接続を切断した学校ネットワークを下図のように4ノードと4リンクで構成するとする.最初はノード1にウイルスがあるだけです.
    最初のノード1は、ノード2とノード3にウイルスを転送し、自身にウイルスが1つ残っています.
    1つのウイルスがノード2に到達すると、1つのウイルスがノード3に送信される.ノード3に到達した別のウイルスは、ノード4に独自のコピーを送信する.
    ノード2からノード3に送信されたウイルスが到着すると、ウイルスはまた、自身のコピーをノード4に送信する.ノード3には2つのウイルスが残っています.
    最後の各ノードのウイルスは次のとおりです.
    HiちゃんとHoちゃんは、現在の状況によって発見されてからしばらく経っても、すべてのノードウイルスの数は変化しないに違いありません.では、ネット全体にとって、最後に何個のウイルスがあるのでしょうか.
    ヒントヒント:トポロジーソートの適用
    入力
    1行目:3個の整数N,M,K,1≦K≦N≦100000,1≦M≦500000
    2行目:K個の整数A[i]、A[i]はハッカーがノードA[i]に1個のウイルスを入れたことを示す.1≤A[i]≤N
    第3..M+2行:行ごとに2つの整数u,vがあり、ノードuからノードvへのネットワークリンクが存在することを示す.データは無ループ図であることを保証します.1≤u,v≤N
    しゅつりょく
    1行目:1個の整数で、最後のネットワーク全体のウイルス数MOD 142857を表す
    サンプル入力
    4 4 1
    1
    1 2
    1 3
    2 3
    3 4
    サンプル出力
        6
    #include "stdafx.h"
    #include 
    #include 
    #include 
    using namespace std;
    typedef struct Node{
    	int val;
    	int virus;
    	int in;
    	vector out;
    	Node(int v = 0) :val(v){
    		virus = 0;
    		in = 0;
    	}
    }Node;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int N, M, K;//N    M   K     
    	int temp;
    	int s, e;
    	int virus_num = 0;
    	queue Q;
    	cin >> N >> M >> K;
    	//cout << Q.empty() << endl;
    	Node* nodeList = new Node[N + 1];
    	for (int i = 0; i < N; i++){
    		nodeList[i+1].val = i+1;
    	}
    	while (K--){
    		cin >> temp;
    		nodeList[temp].virus = 1;
    		Q.push(&nodeList[temp]);
    		virus_num++;
    	}
    	//cout << Q.empty() << endl;
    	while (M--){
    		cin >> s >> e;
    		nodeList[s].out.push_back(&nodeList[e]);
    	}
    	while (Q.empty() == 0){
    		Node* p = Q.front();
    		Q.pop();
    		for (int i = 0; i < p->out.size(); i++){
    			virus_num++;
    			p->out[i]->virus++;
    			Q.push(p->out[i]);
    		}
    	}
    	cout << virus_num << endl;
    	return 0;
    }