| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
这是我的代码,请帮我找出不合理的地方吧> 这个题对结果的输出是不是有什么特殊要求,感觉自己的程序可以找到图的欧拉路(如果存在),可是总是不能AC
#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
class eage
{
public:
bool visited;
string a;
eage(bool v=false):visited(v){}
bool operator <(const eage &b)
{
return a>b.a;
}
};
class Node
{
public:
char value;
vector<eage> Q;
int E;
int O;
Node(int N=0,int m=0):E(N),O(m){Q.clear();}
bool operator <(const Node& d)
{return value<d.value;}
};
vector<Node> v;
int Num=0,size;
void input()
{
int n,i,j,k,fc,sc;
cin>>size;
eage c;
Node d;
string temp;
char a,b;
n=size;
v.clear();
Num=0;
i=0;
while(n--)
{
fc=sc=0;
cin>>temp;
c.a=temp;
a=temp[0];
b=temp[temp.size()-1];
for(j=0;j<i;j++)
{
if(a==v[j].value)
{
fc=1;
v[j].O++;
v[j].Q.push_back(c);
}
if(b==v[j].value)
{
sc=1;
v[j].E++;
}
}
if(fc==0||sc==0)
{
if(a==b)
{
d.value=a;
d.E=1;
d.O=1;
d.Q.push_back(c);
v.push_back(d);
i++;
}
else
{
if(fc==0)
{
d.value=a;
d.Q.push_back(c);
d.O=1;
v.push_back(d);
d.Q.clear();
}
if(sc==0)
{
d.value=b;
d.O=0;
d.E=1;
v.push_back(d);
}
i+=2-fc+sc;
}
}
d.O=0;
d.E=0;
d.Q.clear();
}
sort(v.begin(),v.end());
for(j=0;j<i;j++)
sort(v[j].Q.begin(),v[j].Q.end());
};
bool connected(int index)
{
bool used[26];
fill_n(used,26,false);
queue<int> T;
int i=0,j;
used[index]=true;
T.push(index);
while(!T.empty())
{
int x=T.front();
for(i=0;i<v[x].Q.size();i++)
{
char str=v[x].Q[i].a[v[x].Q[i].a.size()-1];
for(j=0;j<v.size();j++)
if(v[j].value==str&&used[j]==false)
{
T.push(j);
used[j]=true;
}
}
T.pop();
}
for(i=0;i<v.size();i++)
if(used[i]!=true&&v[i].E+v[i].O!=0)
return false;
return true;
};
void dfs(int index)
{
int i,j,e=-1;
for(i=v[index].O-1;i>=0;i--)
{
if(v[index].Q[i].visited==false)
{
v[index].O--;
char str=v[index].Q[i].a[v[index].Q[i].a.size()-1];
for(j=0;j<v.size();j++)
if(v[j].value==str&&connected(j))
e=j;
if(e!=-1)
{
cout<<v[index].Q[i].a;
v[index].Q[i].visited=true;
break;
}
else{
v[index].O++;}
}
}
if(e==-1)
{
return;
}
v[e].E--;
Num++;
if(Num<size)
cout<<".";
dfs(e);
}
void solve()
{
int i,j,sum=0,b=0;
for(i=0;i<v.size();i++)
{
if(v[i].E<v[i].O)
b=i;
if(v[i].E!=v[i].O)
{
sum++;
}
if(v[i].E-v[i].O>1||v[i].E-v[i].O<-1)
{
sum=10;
break;
}
}
if(sum>2)
{
cout<<"***";
return;
}
if(!connected(b))
{
cout<<"***";
return;
}
dfs(b);
}
int main()
{
int c;
cin>>c;
while(c--)
{
input();
solve();
cout<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator