| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大家帮忙看看,Map+并查为什么超时???#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
map<string,int> MM;
int In[500010];
int Father[500010];
int rank[500010];
int T = 0;
void Init()
{
for(int i = 0; i< 500010; ++i)
{
Father[i] = i;
rank[i] = 0;
In[i] = 0;
}
}
int find(int x)
{
if(x == Father[x]) return x;
Father[x] = find(Father[x]);
return Father[x];
}
void Union(int x,int y)
{
int rootx = find(x);
int rooty = find(y);
if(rootx == rooty) return ;
if(rank[x]>rank[y]) Father[y] = x;
else {
Father[x] = y;
if(rank[x] == rank[y]) rank[x]++;
}
}
int getnum(char *p)
{
string s = p;
map<string,int>::iterator it=MM.find(s);
if(it == MM.end())
{
MM[s] = T++;
return T-1;
}
return it->second;
}
int main()
{
MM.clear();
char c1[20],c2[20];
Init();
map<string,int>::iterator it1,it2;
int sh,se;
while(scanf("%s %s",c1,c2)!=EOF)
{
sh = getnum(c1);
se = getnum(c2);
In[sh] ++;
In[se] ++;
Union(find(sh),find(se));
}
if(T==0) {printf("Possible\n");return 0;}
int cnt = 0;
for(int i = 0; i< T; ++i)
{
if(In[i]%2==1) cnt ++;
}
if(cnt!=0&&cnt!=2)
{
printf("Impossible\n");
return 0;
}
int rot = find(0);
for(int i = 1; i< T; ++i)
{
if(find(i) != rot) {printf("Impossible\n");return 0;}
}
printf("Possible\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator