地铁网络(分层图-哈密尔顿路径)

来源:互联网 发布:港台网络评论帝吧出征 编辑:程序博客网 时间:2024/04/19 06:46

地铁网络(分层图-哈密尔顿路径)

分类: 哈密尔顿 306人阅读 评论(0) 收藏 举报



最近Csdn的图片似乎有了改革(1.相册见不到了?搬家难度++ 2.水印   3.图片地址长度++  4.似乎可以用来图床了?TNY)

言归正传:这题是分层图(废话)的加强版——分层图+哈密尔顿路径!!!(几乎没变求D……)

话说我根本不会哈密尔顿啊(求D),指数级算法a(求D)

接下来讲讲第一次写哈密尔顿(都不屑D我)的Exp:

1.如果你想一个状态由它的真子集递归而来 那么(从小到大枚举) Rea:A的真子集<A

2.终点起点一定要拆(以防S,T点拐弯)

3.由2可知初始化和求答案都要考虑2

4.除非k=0,否则S,T点的换乘一定为INF时间


[cpp] view plaincopy
  1. #include<cstdio>  
  2. #include<cstring>  
  3. #include<cstdlib>  
  4. #include<algorithm>  
  5. #include<functional>  
  6. #include<iostream>  
  7. #include<cmath>  
  8. #include<cctype>  
  9. #include<ctime>  
  10. using namespace std;  
  11. #define For(i,n) for(int i=1;i<=n;i++)  
  12. #define Fork(i,k,n) for(int i=k;i<=n;i++)  
  13. #define Rep(i,n) for(int i=0;i<n;i++)  
  14. #define ForD(i,n) for(int i=n;i;i--)  
  15. #define RepD(i,n) for(int i=n;i>=0;i--)  
  16. #define Forp(x) for(int p=pre[x];p;p=next[p])  
  17. #define Lson (x<<1)  
  18. #define Rson ((x<<1)+1)  
  19. #define MEM(a) memset(a,0,sizeof(a));  
  20. #define MEMI(a) memset(a,127,sizeof(a));  
  21. #define MEMi(a) memset(a,128,sizeof(a));  
  22. #define INF (2139062143)  
  23. #define F (100000007)  
  24. #define MAXN (50000+10)  
  25. long long mul(long long a,long long b){return (a*b)%F;}  
  26. long long add(long long a,long long b){return (a+b)%F;}  
  27. long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}  
  28. typedef long long ll;  
  29. ll a,b;  
  30. int n;  
  31. char s[1000];  
  32. int x[1000],y[1000];  
  33. int main()  
  34. {  
  35. //  freopen("robot.in","r",stdin);  
  36. //  freopen(".out","w",stdout);  
  37.     cin>>a>>b;  
  38.     scanf("%s",s+1);n=strlen(s+1);  
  39.     x[0]=y[0]=0;  
  40.     bool bo=0;  
  41.     For(i,n)  
  42.     {  
  43.         if (s[i]=='R') x[i]=x[i-1]+1,y[i]=y[i-1];  
  44.         if (s[i]=='L') x[i]=x[i-1]-1,y[i]=y[i-1];  
  45.         if (s[i]=='U') x[i]=x[i-1],y[i]=y[i-1]+1;  
  46.         if (s[i]=='D') x[i]=x[i-1],y[i]=y[i-1]-1;  
  47.         if (x[i]==a&&y[i]==b) bo=1;  
  48.     }  
  49.     if (bo==1)  
  50.     {  
  51.         cout<<"Yes"<<endl;  
  52.         return 0;  
  53.     }  
  54.     Rep(i,n+1)  
  55.     {  
  56.         int t1=a-x[i],t2=b-y[i];  
  57.         if (t1!=0&&x[n]==0) continue;  
  58.         if (t2!=0&&y[n]==0) continue;  
  59.         if (x[n]==0||y[n]==0)  
  60.         {  
  61.             bool bo1=0,bo2=0;  
  62.             if (x[n]==0) bo1=1;  
  63.             if (y[n]==0) bo2=1;  
  64.             if (bo1&&!bo2) if (t2%y[n]==0&&t2/y[n]>=0) {cout<<"Yes"<<endl;return 0;} else continue;   
  65.             if (!bo1&&bo2) if (t1%x[n]==0&&t1/x[n]>=0) {cout<<"Yes"<<endl;return 0;} else continue;  
  66.             if (!x[i]&&!y[i]) {cout<<"Yes"<<endl;return 0;} else continue;  
  67.         }  
  68.         if (t1%x[n]||t2%y[n]) continue;  
  69.         t1/=x[n],t2/=y[n];  
  70.         if (t1<0||t2<0||t1^t2) continue;  
  71.         cout<<"Yes"<<endl;  
  72.         return 0;  
  73.     }  
  74.     cout<<"No"<<endl;  
  75.       
  76.     return 0;  
  77. }  
原创粉丝点击