| ||||||||||
| 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 | |||||||||
做过的人帮忙找原因,代码很容易看懂!!!In Reply To:大家帮忙看看,Map+并查为什么超时??? Posted by:caizhicong0503 at 2008-08-04 17:37:35 > #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