日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ 99单词拼接(有向图的欧拉(回)路)

發(fā)布時(shí)間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ 99单词拼接(有向图的欧拉(回)路) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 /* 2 NYOJ 99單詞拼接: 3 思路:歐拉回路或者歐拉路的搜索! 4 注意:是有向圖的!不要當(dāng)成無(wú)向圖,否則在在搜索之前的判斷中因?yàn)榕袛嘤袩o(wú)導(dǎo)致不必要的搜索,以致TLE! 5 有向圖的歐拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的節(jié)點(diǎn)個(gè)數(shù)為兩個(gè) 6 有向圖的歐拉回路:所有的節(jié)點(diǎn)都有In[i]==Out[i] 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<algorithm> 12 using namespace std; 13 14 struct node{ 15 char s[35]; 16 int first, end; 17 }; 18 19 bool cmp(node a, node b){ 20 return strcmp(a.s, b.s) <0; 21 } 22 23 node nd[1005]; 24 int In[30], Out[30]; 25 int order[1005], vis[1005]; 26 int n; 27 28 int fun(){ 29 memset(vis, 0, sizeof(vis)); 30 int i; 31 int last=-1; 32 int first=-1; 33 //有向圖歐拉路的判斷 34 for(i=0; i<26; ++i) 35 { 36 if(In[i]!=Out[i]) 37 { //首先入度和出度之差的絕對(duì)值為 1的節(jié)點(diǎn)的要么沒有,要么只有兩個(gè)(沒有歐拉回路,只有歐拉路)! 38 if(Out[i]-In[i]==1 && first==-1) 39 first=i; 40 else if(Out[i]-In[i]==-1 && last==-1) 41 last=i; 42 else 43 return -1; 44 } 45 } 46 if(first>-1 && last>-1) //這種情況是 歐拉路的搜索 ! 47 return first; 48 else if(first==-1 && last==-1) //這種是歐拉回路的搜索! 49 { 50 for(i=0; i<26; ++i) 51 if(In[i]!=0) 52 return i; 53 } 54 else 55 return -1; 56 } 57 58 bool dfs(int st, int cnt){ 59 if(cnt == n) 60 return true; 61 int ld=0, rd=n-1; 62 while(ld<=rd){ 63 int mid=(ld+rd)/2; 64 if(nd[mid].first<st) 65 ld=mid+1; 66 else rd=mid-1; 67 } 68 int m=rd+1; 69 if(nd[m].first > st) return false; 70 for(int i=m; i<n; ++i) 71 if(!vis[i]){ 72 if(nd[i].first > st) 73 return false; 74 if(nd[i].first == st){ 75 vis[i]=1; 76 order[cnt]=i; 77 if(dfs(nd[i].end, cnt+1)) return true; 78 vis[i]=0; 79 } 80 } 81 return false; 82 } 83 84 85 int main(){ 86 int t; 87 scanf("%d", &t); 88 while(t--){ 89 scanf("%d", &n); 90 memset(In, 0, sizeof(In)); 91 memset(Out, 0, sizeof(Out)); 92 for(int i=0; i<n; ++i){ 93 scanf("%s", nd[i].s); 94 nd[i].first=nd[i].s[0]-'a'; 95 nd[i].end=nd[i].s[strlen(nd[i].s)-1]-'a'; 96 ++Out[nd[i].first]; 97 ++In[nd[i].end]; 98 } 99 100 int st = fun(); 101 //因?yàn)樗阉鞯氖亲值湫虻牡谝粋€(gè),所以將字符串從小到大排一下序!在搜索的時(shí)候按照升序搜索組合! 102 sort(nd, nd+n, cmp); 103 if(st==-1 || !dfs(st, 0)) 104 printf("***\n"); 105 else{ 106 printf("%s", nd[order[0]].s); 107 for(int i=1; i<n; ++i) 108 printf(".%s", nd[order[i]].s); 109 printf("\n"); 110 } 111 } 112 return 0; 113 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/3900428.html

總結(jié)

以上是生活随笔為你收集整理的NYOJ 99单词拼接(有向图的欧拉(回)路)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。