南郵OJ 1048図の幅優先遍歴シーケンス


図の幅優先ループシーケンス
時間制限(通常/Java) : 
1000 MS/ 3000 MS          実行メモリ制限:65536 KByte合計コミット:633           テストに合格しました:282 
試合の説明
図(graph)はデータ構造 G=(V,E)であり、VはG中のノードの有限非空集合であり、ノードの双対称はエッジ(edge)である.EはG中の辺の有限集合である.V={0,1,2,…,n−1}とし、図中のノードを頂点(vertex)と呼び、有向図(directed graph)は図中のエッジを表すカップリングが秩序的であり、で1本の有向エッジ(弧とも呼ばれる)を表すと、uをそのエッジの始点(尾)、vをエッジの終点(頭)と呼ぶ.無方向図(undirected graph)とは、図中のエッジを表すカップリングが無秩序であり、無方向図中のエッジ(u,v)と(v,u)が同じエッジであることを意味する.
入力エッジは無方向図を構成し,頂点0を起点とする幅優先ループシーケンスを求める.
入力
第1の動作の2つの整数n,eは、図の頂点数と辺数を表す.次のe行は、行ごとに2つの整数で、1つの辺の起点、終点を表し、重複しない、失敗しないことを保証します.1≤n≤20,0≤e≤190
しゅつりょく
前のn行は無方向図の隣接行列を出力し,最後の行は頂点0を起点とする幅優先ループシーケンスを出力し,いずれの起点に対しても終点シーケンス番号が小さい順に各エッジをループする.各シーケンス番号の後にスペースを出力します.
サンプル入力
4 5 0 1 0 3 1 2 1 3 2 3
サンプル出力
0 1 0 1  1 0 1 1  0 1 0 1  1 1 1 0  0 1 3 2 
テーマソース
CHENZ
#include<iostream>
#include<queue>
using namespace std;
int n,e;
bool a[20][20]={0};
bool v[20]={0};
queue<int> q;
int main(){
	int i,j;
	cin>>n>>e;
	while(e--){
		cin>>i>>j;
		a[i][j]=1;
		a[j][i]=1;
	}
	for(i=0;i<n;++i){
		for(j=0;j<n;++j)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
	q.push(0);
	v[0]=1;
	while(!q.empty()){
		i=q.front();
		q.pop();
		cout<<i<<" ";
		for(j=0;j<n;++j){
			if(a[i][j] && !v[j]){	
				q.push(j);
				v[j]=1;
			}		
		}
		if(q.empty()){			//      
			for(j=0;j<n;++j){
				if(!v[j]){
					q.push(j);
					v[j]=1;		//OL
					break;
				}
			}
		}
	}
	cout<<endl;
}