アルゴリズムの練習--ウイルスを探す
テーマはネットで探して、コードは自分で書いたのです
説明
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を表す
サンプル入力
説明
HiちゃんとHoちゃんの学校のキャンパスネットワークがハッカーに侵入され、ウイルスが投入された.この件は校内BBSですぐにみんなの討論を引き起こして、もちろんHiとHoも参加しました.皆さんがそれぞれ知っていることから、HiさんとHoさんは以下の情報を整理しました.
たとえば,部分ネットワーク接続を切断した学校ネットワークを下図のように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;
}