POJ2337【欧拉通路(模板)】

来源:互联网 发布:sql server seq 编辑:程序博客网 时间:2024/05/17 04:39

有向图存在欧拉回路的充要条件
所有顶点的 入度 和 出度 的和是 偶数,且该图是连通图。

有向图含有欧拉通路的充要条件
起始点s 的入度=出度-1,结束点t的出度=入度-1 或两个点的入度=出度,且该图是连通图。

这边又很有意思的一个!(字典序最小)

so...我也很绝望呀。

先按字典序排一下,因为链式前向星,对于一个点插入的话,后插的先遍历,所以这个排序应该是如果首字母相同就按照字典序大的排。


#include <cstdio>#include <math.h>#include <map>#include <string>#include <stack> #include <iostream>#include <stdlib.h>#include <string.h>#include <queue>#include <algorithm>using namespace std;typedef long long LL;const double eps=1e-9;const int INF=0x3f3f3f3f;string str[1010];bool cmp(const string a, const string b){if(a[0]==b[0])return a>b;return a<b;}int n,in[30],out[30],path[1010],cnt,pre[30];bool exi[1010];int Find(int x){int r=x;while(pre[r]!=r)r=pre[r];int i=x,j;while(pre[i]!=r){j=pre[i];pre[i]=r;i=j;}return r;}void Merge(int x,int y){int xx=Find(x);int yy=Find(y);if(xx!=yy)pre[xx]=yy;}struct Node{int to;int next;int vis;}e[1010];int head[1010];void init(){memset(path,-1,sizeof(path));memset(head,-1,sizeof(head));for(int i=0;i<26;i++)pre[i]=i;memset(exi,false,sizeof(exi));memset(in,0,sizeof(in));memset(out,0,sizeof(out));}void add(int u,int v,int tol){e[tol].to=v;e[tol].next=head[u];e[tol].vis=0;head[u]=tol;}int solve(){int sum=0;for(int i=0;i<26;i++){if(exi[i]&&Find(i)==i)sum++;if(sum>=2)return -1;}int ac=0,bc=0,pos=-1;for(int i=0;i<26;i++){if(!exi[i]) continue;if(in[i]==out[i]) continue;if(in[i]==out[i]+1){ac++;continue;}if(in[i]==out[i]-1){pos=i;bc++;continue;}return -1;}if(!ac&&!bc) return -2;if(ac==1&&bc==1) return pos;return -1;}void DFS(int u){for(int i=head[u];i!=-1;i=e[i].next){if(!e[i].vis){e[i].vis=1;DFS(e[i].to);path[cnt++]=i;}}}void print(){for(int i=cnt-1;i>0;i--)cout << str[path[i]] << '.';cout << str[path[0]] << endl;}int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);init();for(int i=0;i<n;i++)cin>>str[i];sort(str,str+n,cmp);for(int i=0;i<n;i++){int x,y;x=str[i][0]-'a';y=str[i][str[i].size()-1]-'a';add(x,y,i);exi[x]=exi[y]=true;in[y]++;out[x]++;Merge(x,y);}int tmp=solve();cnt=0;if(tmp==-1)printf("***\n");else if(tmp==-2){DFS(str[0][0]-'a');print();}else{DFS(tmp);print();}}return 0;}


0 0