ACWING343 排序(floyd閉包)

2021-10-04 11:38:30 字數 1749 閱讀 1229

給定 n 個變數和 m 個不等式。其中 n 小於等於26,變數分別用前 n 的大寫英文本母表示。

不等式之間具有傳遞性,即若 a>b 且 b>c ,則 a>c。

請從前往後遍歷每對關係,每次遍歷時判斷:

如果能夠確定全部關係且無矛盾,則結束迴圈,輸出確定的次序;

如果發生矛盾,則結束迴圈,輸出有矛盾;

如果迴圈結束時沒有發生上述兩種情況,則輸出無定解。

輸入格式

輸入包含多組測試資料。

每組測試資料,第一行包含兩個整數n和m。

接下來m行,每行包含乙個不等式,不等式全部為小於關係。

當輸入一行0 0時,表示輸入終止。

輸出格式

每組資料輸出乙個佔一行的結果。

結果可能為下列三種之一:

如果可以確定兩兩之間的關係,則輸出 「sorted sequence determined after t relations: yyy…y.」,其中』t』指迭代次數,'yyy…y』是指公升序排列的所有變數。

如果有矛盾,則輸出: 「inconsistency found after t relations.」,其中』t』指迭代次數。

如果沒有矛盾,且不能確定兩兩之間的關係,則輸出 「sorted sequence cannot be determined.」。

資料範圍

2≤n≤26,變數只可能為大寫字母a~z。

輸入樣例1:

4 6a思路:

設定d [i

][j]

=1

d[i][j]=1

d[i][j

]=1代表i

<

ji < j

i<

j,可以用floyd跑閉包,如果出現f[i

][j]

f[i][j]

f[i][j

]和f[j]

[i

]f[j][i]

f[j][i

]同時為1,那麼出現矛盾。如果都為0,那麼無法確認。

不過還有一種方法是拓撲排序,按照大小關係建完圖,入度為0的點自然就是最小點,如果能完成topo排序且每次最小點只有乙個就是合理的。

#include

#include

#include

using

namespace std;

const

int maxn =33;

int d[maxn]

[maxn]

,f[maxn]

[maxn]

;//d[i][j] = 1代表 i < j

intfloyd

(int n)}}

for(

int i =

1;i <= n;i++)}

return1;

}void

solve

(int n,

int m)

else

if(now ==1)

for(

int j =

1;j <= n;j++)}

}sort

(ans,ans + n)

;for

(int j =

0;j < n;j++

)printf

(".\n");

flag =0;

}}if(flag)

}int

main()

return0;

}

AcWing343 排序(floyd傳遞閉包)

題目 給定 n 個變數和 m 個不等式。其中 n 小於等於26,變數分別用前 n 的大寫英文本母表示。不等式之間具有傳遞性,即若 a b 且 b c 則 a c。請從前往後遍歷每對關係,每次遍歷時判斷 輸入格式 輸入包含多組測試資料。每組測試資料,第一行包含兩個整數n和m。接下來m行,每行包含乙個不...

09 排序1 排序

09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...

09 排序1 排序

n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。資料2 11個不相同的整數,測試基本正確性 資料3 10 3個隨機整數 資料4 10 4個隨機整數 資料5 10 5個隨機整數 資料6 10 5個順序整數 資料7 10 5個逆序整數 資料8 10 5個基本有序的整數 資料9 10 5個隨機正...