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不给用,_也不给用,还能不能好好用奇怪的姿势解题啦!!!
总而言之明天再继续打题吧。困~