poj 2337 && zoj 1919 欧拉回路+连通性判断
2015-04-30 10:49
267 查看
题目要求按字典序排列,而且可能有重边
所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面
这里有一点问题就是我一开始使用的是qsort:
int cmp(const void *s1 , const void *s2)
{
return strcmp((char*)s1 , (char*)s2)<0;
}
qsort(str , n , sizeof(str[0]) , cmp)
poj一直wa,试了发zoj却过了,可能是编译器原因吧,然后将字符串放入了结构体重新进行排序,poj才给过
寻找欧拉回路的关键代码
void dfs(int u , int id)
{
for(int i=first[u] ; i!=-1 ; i=e[i].next){
if(e[i].flag){
e[i].flag=false;
dfs(e[i].y , e[i].id);
rec[top2++]=e[i].id;
}
}
}
将其逆序输出即可
所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面
这里有一点问题就是我一开始使用的是qsort:
int cmp(const void *s1 , const void *s2)
{
return strcmp((char*)s1 , (char*)s2)<0;
}
qsort(str , n , sizeof(str[0]) , cmp)
poj一直wa,试了发zoj却过了,可能是编译器原因吧,然后将字符串放入了结构体重新进行排序,poj才给过
寻找欧拉回路的关键代码
void dfs(int u , int id)
{
for(int i=first[u] ; i!=-1 ; i=e[i].next){
if(e[i].flag){
e[i].flag=false;
dfs(e[i].y , e[i].id);
rec[top2++]=e[i].id;
}
}
}
将其逆序输出即可
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N 1010 int n , in , out , cnt , st , la; int first , k; int top1 , top2; int rec ; struct Str{ char str[30]; }str ; bool cmp(Str s1 , Str s2) { return strcmp(s1.str , s2.str)>0; } struct Edge{ int y , next , id; bool flag; }e[N*2]; Edge stack ; void add_edge(int x,int y ,int id) { e[k].y=y , e[k].id = id , e[k].flag=true , e[k].next=first[x]; first[x]=k++; } void dfs(int u , int id) { for(int i=first[u] ; i!=-1 ; i=e[i].next){ if(e[i].flag){ e[i].flag=false; dfs(e[i].y , e[i].id); rec[top2++]=e[i].id; } } } void Fleury() { top1 = top2 = 0; dfs(st , -1); } int main() { // freopen("a.in" , "r" , stdin); int T; scanf("%d" , &T); while(T--) { scanf("%d" , &n); for(int i=0 ; i<n ; i++) scanf("%s" , str[i].str); sort(str , str+n , cmp); // for(int i=0 ; i<n ; i++) printf("%s\n" , str[i]); memset(first , -1 , sizeof(first)); memset(in , 0 , sizeof(in)); memset(out , 0 , sizeof(out)); k=0; for(int i=0 ; i<n ; i++){ int len = strlen(str[i].str); int a = str[i].str[0]-'a' , b = str[i].str[len-1]-'a'; add_edge(a , b , i); in[b]++ , out[a]++; } cnt=0,st=-1 , la=-1; bool flag=true; for(int i=0;i<26;i++){ if(abs(out[i]-in[i])>1){ flag=false; break; } if(out[i]!=in[i]){ cnt++; if(st==-1 && out[i]==in[i]+1) st=i; else if(la==-1 && in[i]==out[i]+1) la=i; else{ flag=false; break; } } } if(!flag || (cnt!=0 && cnt!=2)){printf("***\n");continue;} if(st<0){ for(int i=0 ; i<26 ; i++) if(out[i]){ st = i; break; } } Fleury(); // cout<<top2<<endl; if(top2<n){printf("***\n");continue;} for(int i=top2-1 ; i>0 ; i--) printf("%s." , str[rec[i]].str); printf("%s\n" , str[rec[0]].str); } return 0; }
相关文章推荐
- POJ 2337 && ZOJ 1919--Catenyms 【有向图 && 欧拉路判断 && 欧拉路径】
- zoj 1919 || poj 2337 Catenyms
- zoj 1919 poj 2337 Catenyms(欧拉路径求解)
- ZOJ 1683 Fishnet (POJ 1408)(计算线段交点&叉积求面积)
- poj 1014 && zoj 1149 Dividing --- dfs剪枝
- POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
- POJ 3653 & ZOJ 2935 & HDU 2722 Here We Go(relians) Again(最短路dijstra)
- k倍动态减法(poj 3922 && zoj 3599)
- poj 1637 & zoj 1992 混合图的欧拉回路
- ZOJ 1103(POJ 2415)(HDU 1252)Hike…
- POJ 3653 & ZOJ 2935 & HDU 2722 Here We Go(relians) Again(最短路dijstra)
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)
- poj 3268 Silver Cow Party & zoj 2008 Invitation Cards
- poj 1511&&zoj 2008 Invitation Cards 最短路+SPFA
- poj 2031 && zoj 1718 Building a Space Station
- !POJ 2251 & ZOJ 1940--BFS(第一道BFS)
- zoj 2158 && poj 1718 Truck History
- zoj 1919(AC) && poj 2337(WA) (并差集 + 欧拉回路或欧拉通路)
- zoj 1942 && poj 2253 Frogger
- poj--2242--The Circumference of the Circle&&[NYIST 1142&&ZOJ1090]