HDU 1272 小希的迷宫

Portal: http://acm.hdu.edu.cn/showproblem.php?pid=1272

是道好题

噗噗噗,咱果断的优化大展神威,一次AC,爽到~

底下Discuss哀鸿遍野,出题者卡的一手好常数.

限制是1000MS直接300MS过了,然而最快的人直接0MS,%%%

 1 #include<iostream>
 2 #include<map>
 3 using namespace std;
 4 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 5 #define FORD(i,j,k) for(int i=j;i>=k;i--)
 6 #define LL long long
 7 #define maxn 10010
 8 int father[maxn],val[maxn];
 9 int x,y,k;
10 bool flag;
11 map<int,int> ID;
12 int setfind(int xx)
13 {
14     int fa=father[xx];
15     if(fa==xx) return fa;
16     else return father[xx]=setfind(fa);
17 }
18 bool setunion(int xx,int yy)
19 {
20     int X=setfind(xx);
21     int Y=setfind(yy);
22     if(X==Y) return true;
23     else if(val[X]>val[Y]) father[Y]=X;
24     else father[X]=Y;
25     if(val[X]==val[Y]) val[Y]++;
26     return false;
27 }
28 bool issame(int xx,int yy)
29 {
30     return setfind(xx)==setfind(yy);
31 }
32 bool setcheck()
33 {
34     FOR(i,1,k-1)
35     if(!issame(i,i+1)) return true;
36     return false;
37 }
38 int main()
39 {
40 while(true)
41 {
42     k=0;
43     flag=true;
44     for(cin>>x>>y;x>0&&y>0;cin>>x>>y)
45     {
46         if(!ID.count(x)) {k++; ID[x]=k; father[k]=k; val[k]=1;}
47         if(!ID.count(y)) {k++; ID[y]=k; father[k]=k; val[k]=1;}
48         if(setunion(ID[x],ID[y])) {for(cin>>x>>y;x>0&&y>0;cin>>x>>y);flag=false;break;}
49     }
50     if(x==-1) return 0; 
51     if (setcheck()) flag=false;
52     if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl;
53     ID.clear();
54 }
55 return 0;
56 }
长长的代码

这题打了30min,给我感觉最深的是模块化程序设计和代换化归思想的重要性

当然还有:

神TM error C2872 啊!rank不给用,_也不给用,还能不能好好用奇怪的姿势解题啦!!!

总而言之明天再继续打题吧。困~

 

posted @ 2016-07-01 23:19  MukoiAoi  阅读(113)  评论(0编辑  收藏  举报