大致題意:每個樣例包含兩行,第一行輸入n個字符,可能是無序的。第二行輸入成對的a b,代表a要在b前面。輸出所有的符合這樣的序列。
思路:很明顯的拓撲排序。要輸出所有的序列,那麼就從入度為0的點進行dfs,每次選擇一個入度為0的點,加入輸出序列並把與它相鄰的點的入度減一。dfs結束後要把狀態再改回來。
#include #include #include #include #include #include #include #include #include #define LL long long #define _LL __int64 using namespace std; const int maxn = 110; char contents[30]; bool mapp[60][60]; int n = 0; char t,t1,t2; int flag; int in[30]; int vis[30]; int ans[30]; void dfs(int num) { if(num == n) { for(int i = 0; i < n; i++) printf("%c",ans[i]); printf("\n"); return; } for(int i = 0; i < n; i++) { if(!vis[i] && !in[ contents[i]-'a' ]) { for(int j = 0; j < n; j++) { if(mapp[contents[i]-'a'][contents[j]-'a']) { in[ contents[j]-'a']--; } } ans[num] = contents[i]; vis[i] = 1; dfs(num+1); //注意將狀態更改回來 for(int j = 0; j < n; j++) { if(mapp[contents[i]-'a'][contents[j]-'a']) { in[ contents[j]-'a']++; } } vis[i] = 0; } } } int main() { flag = 0; while(~scanf("%c",&t)) { if(t >= 'a' && t <= 'z') { contents[n++] = t; continue; } else if(t == ' ') continue; else { if(flag) printf("\n"); flag = 1; sort(contents,contents+n); //因為輸入可能是無序的,先排序 memset(in,0,sizeof(in)); memset(mapp,false,sizeof(mapp)); memset(vis,0,sizeof(vis)); while(~scanf("%c %c",&t1,&t2)) { mapp[t1-'a'][t2-'a'] = 1; in[t2-'a']++; if(getchar() == '\n') break; } dfs(0); n = 0; } } return 0; }
圖說 堆排序,堆排序 用例: 將一組數據從大到小進
結構體在內存中的對齊規則,結構體對齊規則文章轉自:http:
[cpp] * * 程序的版權和版本聲明部分 * Co
bzoj3208--記憶化搜索,bzoj3208--記憶搜索
多態實現之虛函數,多態實現之函數多態的實現分為靜態多態和動態
UVa 103,uva103題目來源:https://uva