I have tried everything on reading input part, writing output part. But still the time restrictions are too strict.
I am pasting the code here:
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.StringTokenizer;
class BUGLIFE {
static int N, E;
static char visited[]= new char[2000];//'M','F' or 'N'
static LinkedList<Integer>[] adj = (LinkedList<Integer>[])new LinkedList[2000];
static void init()
{
for(int i=0;i<2000;i++)
adj[i]=new LinkedList<Integer>();
}
//call as soon as you get the N, E
static void prepare(int n, int e)
{
N=n;
E=e;
for(int i=0;i<N;i++)
{
visited[i]='N';//no gender for now
adj[i].clear();
}
}
static boolean isTwoColoured()
{
//after prepare
for(int i=0;i<N;i++)
{
if(visited[i]=='N')
{
boolean ans = bfs(i);
if(!ans) return false;
}
}
return true;
}
static char opp(char ch)
{
char ans = 'N';
switch(ch)
{
case 'M': ans = 'F'; break;
case 'F': ans = 'M'; break;
}
return ans;
}
static void addEdge(int u, int v)
{
adj[u].add(v);
adj[v].add(u);
}
static boolean bfs(int s)
{
LinkedList<Integer> queue = new LinkedList<Integer>();
visited[s]='M';//lets be biased first ever node be M
queue.addLast(s);
while(queue.size()>0)
{
int curr = queue.removeFirst();
char currch = visited[curr];
char oppch = opp(currch);
for(int i:adj[curr])
{
//edge exists and not visited
if(visited[i]=='N')
{
visited[i]=oppch;
queue.addLast(i);
}
else if(visited[i]==currch)//visited and with opp sign which ought to be!
{
return false;
}
//else ignore if already visited
}
}
return true;
}
public static void main(String[] args)throws Exception
{
init();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
int tests = Integer.parseInt(br.readLine());
int k = 1;
while(tests-->0)
{
String l = br.readLine();
StringTokenizer stoken = new StringTokenizer(l," ");
int n = Integer.parseInt(stoken.nextToken());
int e = Integer.parseInt(stoken.nextToken());
prepare(n, e);
while(e-->0)
{
String line = br.readLine();
StringTokenizer stoken2 = new StringTokenizer(line," ");
int u = Integer.parseInt(stoken2.nextToken())-1;
int v = Integer.parseInt(stoken2.nextToken())-1;
addEdge(u, v);
}
String ans = isTwoColoured()?"No suspicious bugs found!":"Suspicious bugs found!";
out.println("Scenario #"+k+":");
out.println(ans);
k++;
out.flush();
}
}
}