09-08 HDU_Steps5.2 字典樹,拓撲,哈夫曼 HDU1075 HDU1251 HDU1671 HDU1285 HDU2094 HDU3231 HDU1053 HDU2527

來源:互聯網
上載者:User

5.2.1 HDU1075 What Are You Talking About

簡單的字典樹,在翻譯時注意一點小問題,字串的問題就是處理有些麻煩..

#include <cstdio>#include <string.h>#include <cstdlib>using namespace std;char line[30],s1[12],s2[12],tline[3010];struct trie{trie *next[26];char c[12];int has;trie(){for(int i=0;i<26;i++)next[i]=NULL;has=0;}}*root;void instrie(char s11[12],char s12[12]){int len=strlen(s12);trie *p=root;for(int i=0;i<len;i++){int t=s12[i]-'a';if(p->next[t]==NULL)p->next[t]=new trie;p=p->next[t];} p->has=1;strcpy(p->c,s11);}bool search(char s11[12]){int len=strlen(s11);trie *p=root;for(int i=0;i<len;i++){int t=s11[i]-'a';if(p->next[t]==NULL)return false;p=p->next[t];} if(p->has==0)return false;strcpy(s2,p->c);return true;}int main(){root=new trie;while(gets(line)){if(strcmp(line,"START")==0)continue;if(strcmp(line,"END")==0)break;sscanf(line,"%s%s",s1,s2);instrie(s1,s2);}while(gets(tline)){if(strcmp(tline,"START")==0)continue;if(strcmp(tline,"END")==0)break;int i=0,j=0,len=strlen(tline);while(i<len){if(tline[i]<'a'||tline[i]>'z'){//尋找這個單詞,找到輸出對應的單詞,找不到直接輸出原文 s1[j]='\0';if(search(s1))printf("%s",s2);else printf("%s",s1);//列印標點,開始搜尋下一個單詞 printf("%c",tline[i]);j=0,i++;}else{s1[j]=tline[i];i++,j++;}}printf("\n");}}

5.2.2 HDU1251 統計難題

字典樹,經過的字母標記全部加一,尋找的時候返回該字母的標記


5.2.3 HDU1671 Phone List

判斷一組字串,有沒有字串是其它字串的首碼

讀入的時候就可以判斷該字串是不是其它字串的首碼,或者尾碼..用一個標記標記該位置是否為單詞結尾

如果存入單詞的結尾處已經有單詞經過,說明存入單詞是另一單詞的首碼,如果存入單詞經過的地方有其它單詞的結尾,說明另一單詞是存入單詞的首碼..這兩種情況都返回false

int instrie(char s1[11]){int len=strlen(s1);int r=1; trie *p=root;for(int i=0;i<len;i++){int t=s1[i]-'0';//是其它單詞的首碼 if(i==len-1&&p->next[t]!=NULL)r=0;if(p->next[t]==NULL)p->next[t]=new trie;p=p->next[t];//其它單詞是它的首碼if(p->e==1)r=0; }p->e=1;//標記在這裡結束 return r; }

5.2.4 HDU1285 確定比賽名次

輸入資料保證有序,那就是赤果果的拓撲排序了

輸入有點陰,會有重複邊,注意不要把入度算多了!

#include <cstdio>#include <string.h>using namespace std;const int MAXN=505;int map[MAXN][MAXN],n,m,a,b,in[MAXN],ans[MAXN];void topo(){int top=1,u;memset(ans,0,sizeof ans);while(1){for(u=1;u<=n;u++)if(in[u]==0)break;if(u==n+1)return;in[u]=-1;ans[top++]=u;for(int v=1;v<=n;v++)if(map[u][v]==1)in[v]--;}}int main(){while(scanf("%d%d",&n,&m)!=EOF){memset(map,0,sizeof map);memset(in,0,sizeof in);while(m--){scanf("%d%d",&a,&b);if(map[a][b]==0)map[a][b]=1,in[b]++;}topo();printf("%d",ans[1]);for(int i=2;i<=n;i++)printf(" %d",ans[i]);printf("\n");}return 0;} 


5.2.5 HDU2094 產生冠軍

首先轉換字串為標號,然後建圖

冠軍存在的條件是,有且僅有一個入度為0的點並且這個從這個點可以訪問到其它所有點


5.2.6 HDU3231 Box Relations

一道好題,但是不會做...建圖比較難,三個軸都要建圖,然後分別拓撲排序,排序失敗的話就說明impossible了..

代碼不是我自己寫的,基本都是模仿大牛的代碼的..

#include <cstdio>#include <string.h>using namespace std;int n,r,a,b,ne;char c;struct node{int v,next;node(){};node(int a,int b){next=a,v=b;}}e[500000];int head[4][2001],ind[4][2001],ans[4][2001],q[4][2001];//鄰接表建圖 void ins(int op,int u,int v){e[ne]=node(head[op][u],v);head[op][u]=ne++; ind[op][v]++; }//初始化,注意初始化每個立方體本身邊的關係 void init(){ne=0;memset(ind,0,sizeof ind);memset(head,-1,sizeof head);for(int i=1;i<=n;i++)for(int j=1;j<=3;j++)ins(j,i,i+n);}//拓撲排序,返回是否成功 bool topo(int op){int front=0,top=0;for(int i=1;i<=2*n;i++)if(ind[op][i]==0)q[op][top++]=i,ind[op][i]--;while(front<top){int u=q[op][front++];for(int i=head[op][u];i!=-1;i=e[i].next){int v=e[i].v;ind[op][v]--; if(ind[op][v]==0)q[op][top++]=v,ind[op][v]--;}} return top==2*n;}void solve(){for(int i=1;i<=3;i++){if(!topo(i)){printf("IMPOSSIBLE\n");return;}}printf("POSSIBLE\n");//根據拓撲關係決定答案 for(int k=1;k<=3;k++)for(int i=0;i<2*n;i++)ans[k][q[k][i]]=i;for(int i=1;i<=n;i++){printf("%d %d %d ",ans[1][i],ans[2][i],ans[3][i]);printf("%d %d %d\n",ans[1][i+n],ans[2][i+n],ans[3][i+n]);}}int main(){int cas=1;while(scanf("%d%d",&n,&r),n||r){init();while(r--){scanf(" %c%d%d",&c,&a,&b);if(c=='I'){for(int i=1;i<=3;i++){ins(i,a,b+n);ins(i,b,a+n);}}else{ins(c-'X'+1,a+n,b);}}printf("Case %d: ",cas++);solve();printf("\n");}}

5.2.7 HDU1053 Entropy

描述一大敵,其實就是Huffman編碼,用優先隊列實現,注意只有一種字元的情況

#include <cstdio>#include <queue>#include <string.h>using namespace std;char line[10000];int pl[27],len;int main(){while(scanf("%s",line)){if(strcmp(line,"END")==0)break;//統計頻度 memset(pl,0,sizeof pl);len=strlen(line);for(int i=0;i<len;i++){if(line[i]=='_')pl[0]++;else pl[line[i]-'A'+1]++;}//判斷是否單一字元int yes=0; for(int i=0;i<27;i++){if(pl[i]==len){printf("%d %d 8.0\n",len*8,len);yes=1;break;}}if(yes)continue;//使用優先隊列統計HUFFMAN編碼 priority_queue<int,vector<int>,greater<int> > q;int ans=0,a,b;for(int i=0;i<27;i++)if(pl[i]!=0)q.push(pl[i]);while(1){int a=q.top();q.pop();if(q.empty())break;int b=q.top();q.pop();ans+=a+b;q.push(a+b);}printf("%d %d %.1lf\n",len*8,ans,len*8.0/ans);}return 0;}

5.2.8 HDU2527 Safe Or Unsafe

也是Huffman編碼 代碼和上面差不多

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.