欧拉回路——洛谷 P1341 无序字母对
2017-06-13 09:39
316 查看
https://www.luogu.org/problem/show?pid=1341#sub
很狗的一道题;
这种题在我们绍兴一中出题人是要被阿掉的;
首先就是两个char会出现相同的情况;
然后每个char最多出现52次;
所以n其实不小的;
我靠;
这些东西都没有很明白的说清楚;
然后我们发现n对关系n+1个点;
就是欧拉回路;
其实就是一笔画问题;
度数为奇的点为2或者0的话可以有一笔画;
那么对于这两种情况取字典序最小的一个点开始dfs,一定可以出结果;
然后数据的话codevs有的;
很狗的一道题;
这种题在我们绍兴一中出题人是要被阿掉的;
首先就是两个char会出现相同的情况;
然后每个char最多出现52次;
所以n其实不小的;
我靠;
这些东西都没有很明白的说清楚;
然后我们发现n对关系n+1个点;
就是欧拉回路;
其实就是一笔画问题;
度数为奇的点为2或者0的话可以有一笔画;
那么对于这两种情况取字典序最小的一个点开始dfs,一定可以出结果;
然后数据的话codevs有的;
#include<bits/stdc++.h> #define Ll long long using namespace std; const Ll N=100; bool f ; int a[N*100],A ; int n,x,y,m,sum,u1,u2; int get(){ char c; cin>>c; if(c<='Z')return c-64;else return c-96+26; } void out(){ for(int i=1;i<=n+1;i++) if(a[i]<=26)printf("%c",char(a[i]+64)); else printf("%c",char(a[i]+96-26)); exit(0); } void dfs(int x,int k){ a[k]=x; if(k>n)out(); for(int i=1;i<=52;i++) if(f[x][i]){ f[x][i]=f[i][x]=0; dfs(i,k+1); f[x][i]=f[i][x]=1; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ x=get();y=get(); f[x][y]=f[y][x]=1; A[x]++;A[y]++; } for(int i=99;i;i--) if(A[i])if(A[i]&1)sum++,u1=i;else u2=i; if(sum!=0&&sum!=2){printf("No Solution");return 0;} if(sum)dfs(u1,1);else dfs(u2,1); }
相关文章推荐
- 洛谷P1341 无序字母对(欧拉回路)
- 洛谷1341无序字母对(无向图欧拉回路)
- 洛谷 P1341无序字母对
- 洛谷 P1341 无序字母对
- 洛谷 P1341 无序字母对 题解
- 洛谷P1341 无序字母对
- 洛谷P1341 无序字母对
- 无序字母对 洛谷 1341 欧拉通路/欧拉回路
- 无序字母对_洛谷1341_欧拉回路
- 欧拉回路 (洛谷1341 无序字母对)
- 洛谷 P1341 无序字母对
- 洛谷 [P1341]无序字母对
- 洛谷P1341 无序字母对[无向图欧拉路]
- 洛谷P1341 无序字母对
- [洛谷1341]无序字母对---欧拉回路/通路
- [洛谷1314]无序字母对
- 洛谷1341 无序字母对 欧拉路
- P1341 无序字母对
- 洛谷1341 无序字母对
- 洛谷P1341 无序字母对(欧拉回路)