您的位置:首页 > 其它

是否存在欧拉路径问题 POJ - 1386 hihoCoder - 1181

2017-09-16 21:40 453 查看
poj - 1386

//题意: 给出结果字符串, 问他们是否可以头尾相连起来.

//思路: 以每个单词的头和尾作为节点, 每个单词头尾之间连接一条有向边, 最后看是否可以找到一条有向欧拉路径即可. 注意两点:

1: 根据有向欧拉路的判定, 最后cnt最好是标记的入度和出度不等的顶点数, 因为如果有欧拉路, cnt一定等于0. 否则的话做法稍显麻烦.

2: 一定要判当前的图中是否联通. 不联通的话那直接就是NO了.

AC Code

const int maxn = 100+5;
int cas=1;
int out[maxn],in[maxn];
int fa[maxn];
int Find(int x)
{
return fa[x] == x? x: fa[x] = Find(fa[x]);
}
void solve()
{
Fill(in,0); Fill(out,0);
for(int i=1;i<=26;i++) fa[i] = i;
int n; scanf("%d",&n);
while(n--){
string s; cin >> s;
int len = s.size();
int t1 = s[0]-'a'+1; int t2 = s[len-1]-'a'+1;
out[t1]++; in[t2]++;
if(Find(t1) != Find(t2)) fa[Find(t2)] = Find(t1);
}
int tt = 0;
int ans1=0,ans2=0;
for(int i=1;i<=26;i++){
if(!in[i] && !out[i]) continue;
if(Find(i) == i) tt++;   //这里还要注意下是找Find(i),而不是fa[i],坑了好久.
if(abs(in[i]-out[i]) == 1) ans2++;
else if(in[i] != out[i]) ans1++;
}
if(ans1 == 0 && (ans2 == 0 || ans2 == 2) && tt == 1) puts("Ordering is possible.");
else puts("The door cannot be opened.");
}


hihoCoder - 1181

题意和思路就不说了, 题面都有,说说几个注意点就是了.

1: 这个是根据点来建的图, 边上是没有东西的, 转化也不容易转化, 又因为要删边, 所以选择使用临接表来存图.

2: 注意两个点之间可能不只一条路.

AC Code

const int maxn = 1e3+5;
int cas=1;
int du[maxn],path[maxn];
int mapp[maxn][maxn];
int n,m,top=0;
void dfs(int u)
{
for(int i=1;i<=n;i++){
if(mapp[u][i]){
mapp[u][i]--; mapp[i][u]--;
dfs(i);
}
}
path[top++] = u;
}
void solve()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v; scanf("%d%d",&u,&v);
mapp[u][v]++; mapp[v][u]++;
du[u]++; du[v]++;
}
int flag = 1;
for(int i=1;i<=n;i++){
if(du[i] & 1) {
dfs(i); flag = 0;
break;
}
}
if(flag) dfs(1);
for(int i=0;i<top;i++){
printf("%d%c",path[i],i==top-1?'\n':' ');
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: