<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -6,6 +6,7 @@
 #include &lt;cassert&gt;
 #include &lt;iostream&gt;
 #include &lt;fstream&gt;
+#include &lt;set&gt;
 using namespace std;
 
 list&lt;int&gt; adjList;
@@ -19,11 +20,28 @@ public:
 	int to;
 };
 
+class Student
+{
+public:
+	Student(int ID):id(ID){adjList = new set&lt;int&gt;();group=new int(-1);}
+	int id;
+	int *group;
+	set&lt;int&gt;* adjList;
+	bool operator&lt;(const Student&amp; other)const
+	{
+		return id&lt;other.id;
+	}
+	bool operator==(const Student&amp; other)const
+	{
+		return id==other.id;
+	}
+};
+
 
-int _tmain(int argc, _TCHAR* argv[])
+int main(int argc, char* argv[])
 {
-	int size = 0;
 	vector&lt;Edge&gt; edges;
+	set&lt;Student&gt; students;
 	ifstream inf(&quot;calling.inp&quot;);
 	int edgesize;
 	inf&gt;&gt;edgesize;
@@ -32,63 +50,66 @@ int _tmain(int argc, _TCHAR* argv[])
 		int from, to;
 		inf&gt;&gt;from&gt;&gt;to;
 		edges.push_back(Edge(from, to));
+		students.insert(Student(from));
+		students.insert(Student(to));
+		
 	}
 	inf.close();
-	for(vector&lt;Edge&gt;::iterator iter=edges.begin(); iter!=edges.end(); iter++)
-		size = max(iter-&gt;to, size);
-	vector&lt; list&lt;int&gt;* &gt; adjLists(size);
-	for(int i = 0; i&lt;size; i++)
-		adjLists[i] = new list&lt;int&gt;;
-	
-	vector&lt;int&gt; rz(size);
-	for(int i = 0; i&lt;size; i++)
-		rz[i] = -1;
-
+		
 	for(vector&lt;Edge&gt;::iterator iter=edges.begin(); iter!=edges.end(); iter++)
 	{
-		adjLists[iter-&gt;from-1]-&gt;push_back(iter-&gt;to-1);
-		adjLists[iter-&gt;to-1]-&gt;push_back(iter-&gt;from-1);
+		students.find(Student(iter-&gt;from))-&gt;adjList-&gt;insert(iter-&gt;to);
+		students.find(Student(iter-&gt;to))-&gt;adjList-&gt;insert(iter-&gt;from);
 	}
-	int maxgroup = 0;
-	for(int i = 0; i&lt;size; i++)
+	
+	vector&lt;int&gt; groups;
+	for(set&lt;Student&gt;::iterator iter = students.begin(); iter!=students.end(); iter++)
 	{
-		list&lt;int&gt; *adjList = adjLists[i];
-		int group = rz[i] == -1?maxgroup++:rz[i];
-		
 		vector&lt;int&gt; stack;
-		for(list&lt;int&gt;::iterator iter = adjList-&gt;begin(); iter!=adjList-&gt;end(); iter++)
+		int group;
+		if(*(iter-&gt;group) == -1)
+		{
+			group = groups.size();
+			*(iter-&gt;group) = group;
+			groups.push_back(1);
+		}
+		else
+			group = *(iter-&gt;group);
+		
+		set&lt;int&gt; *adjList = iter-&gt;adjList;
+		for(set&lt;int&gt;::iterator iter = adjList-&gt;begin(); iter!=adjList-&gt;end(); iter++)
 			stack.push_back(*iter);
 
 		while(stack.size())
 		{
-			int val = stack.back();
+			set&lt;Student&gt;::iterator s = students.find(Student(stack.back()));
 			stack.pop_back();
-			if(rz[val] == -1)
+			if(*(s-&gt;group) == -1)
 			{
-				rz[val] = group;
-				adjList = adjLists[val];
-				for(list&lt;int&gt;::iterator iter = adjList-&gt;begin(); iter!=adjList-&gt;end(); iter++)
+				*(s-&gt;group) = group;
+				groups[group]++;
+				for(set&lt;int&gt;::iterator iter = s-&gt;adjList-&gt;begin(); iter!=s-&gt;adjList-&gt;end(); iter++)
 					stack.push_back(*iter);
 			}
 		}
 	}
-	assert(3==maxgroup);
-	vector&lt;int&gt; groups(maxgroup);
-	vector&lt;int&gt; leaders(maxgroup);
-	int maxNumberOfPeople = -1;
-	for(int i=0; i&lt;size; i++){
-		groups[rz[i]]++;
-		maxNumberOfPeople = max(maxNumberOfPeople, groups[rz[i]]);
-		leaders[rz[i]]=i+1;
-	}
-	int finalLeader = -1;
-	for(int i=0; i&lt;maxgroup;i++)
+	int maxNumber = *max_element(groups.begin(), groups.end());
+	
+	vector&lt;int&gt; rzGroups;
+	for(vector&lt;int&gt;::iterator iter = groups.begin(); iter!=groups.end(); iter++)
+		if(maxNumber==*iter)
+			rzGroups.push_back(iter-groups.begin());
+	
+	for(set&lt;Student&gt;::reverse_iterator iter = students.rbegin(); iter!=students.rend(); iter++)
 	{
-		if(maxNumberOfPeople == groups[i])
-			finalLeader = max(finalLeader, leaders[i]);
+		for(vector&lt;int&gt;::iterator g = rzGroups.begin();g!=rzGroups.end();g++)
+			if(*g == *(iter-&gt;group))
+			{
+				ofstream of(&quot;calling.out&quot;);
+				of&lt;&lt;iter-&gt;id;
+				of.close();
+				return 0;
+			}
 	}
-	ofstream of(&quot;calling.out&quot;);
-	of&lt;&lt;finalLeader;
-	of.close();
-	return 0;
+	return -1;
 }
\ No newline at end of file</diff>
      <filename>ass04/calling.cpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a44af379a0717a602fee08e8dec32473714d699d</id>
    </parent>
  </parents>
  <author>
    <name>ljsking</name>
    <email>ljsking@gmail.com</email>
  </author>
  <url>http://github.com/ljsking/algorithm/commit/49bcb3bf651e7bb5d1ed301fae5befeeae7a46e8</url>
  <id>49bcb3bf651e7bb5d1ed301fae5befeeae7a46e8</id>
  <committed-date>2008-09-30T00:48:23-07:00</committed-date>
  <authored-date>2008-09-30T00:48:23-07:00</authored-date>
  <message>got 100 points for sample data.</message>
  <tree>79896253c990d15a1867ca92f7670a8276622973</tree>
  <committer>
    <name>ljsking</name>
    <email>ljsking@gmail.com</email>
  </committer>
</commit>
