給你一些已經確定的元素之間的關系,請你判斷是否能從這些元素關系中推斷出其他的元素關系。
輸入的第一行是一個整數N,表示測試數據的組數。每組輸入首先是一個正整數m(m<=100),表示給定元素關系的個數。接下來m行,每行一個元素關系,格式為:元素1<元素2 或者 元素1>元素2元素用一個大寫字母表示,輸入中不會包含沖突的關系。
對于每組輸入,第一行輸出:Case d:,d是測試數據的序號,從1開接下來輸出所有推斷出的新的元素關系,按照字典序從小到大排序,格式為詳見樣例輸出。每個元素關系占一行,輸入中給定的元素關系不要輸出。如果沒有新的元素關系推斷出來,則輸出NONE。
23A<BC>BC<D2A<BC<DSample Output
Case 1:A<CA<DB<DCase 2:NONE分析:比賽的時候沒能將這個題和圖的知識聯系起來,所以思路完全錯誤。百度之后發現就是一個簡單的有向圖問題。 元素1<元素2 或 元素2>元素1,表示從元素1到元素2有一條通路,以此類推,構成一個有向無環圖。參考代碼:#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<map>using namespace std;const int maxn = 30;int m;int g[maxn][maxn];//g[i][j]為1表示結點i+'A'到結點j+'A'直接可達int flag[maxn][maxn];//標記 值為1表示題目給出的關系 為0表示推理出來的關系int main(){ int T; scanf("%d",&T); int cnt = 1; while( T--) { memset(g,0,sizeof(g)); memset(flag,0,sizeof(flag)); scanf("%d",&m); for( int i = 1; i <= m; i++) { char s[5]; scanf("%s",s); int u = s[0]-'A'; int v = s[2]-'A'; if( s[1] == '<') { g[u][v] = 1; flag[u][v] = 1; } else { g[v][u] = 1; flag[v][u] = 1; } } for( int i = 0; i < maxn; i++) for( int j = 0; j < maxn; j++) for( int k = 0; k < maxn; k++) if( g[i][j] && g[j][k]) g[i][k] = 1; PRintf("Case %d:/n",cnt++); int tmp = 1; for( int i = 0; i < maxn; i++) for( int j = 0; j < maxn; j++) if( g[i][j] && !flag[i][j]) { printf("%c<%c/n",i+'A',j+'A'); tmp = 0; } if( tmp) printf("NONE/n"); } return 0;}
新聞熱點
疑難解答