洛谷 P1347 【排序】

這篇題解沒有用拓補排序 (嗐 菜就直說)c++

我的感受這道題拓補排序沒有變種\(Floyd\)好寫吧,思惟難度也低一點(親眼目擊機房dalao這道題拓補排序調了好久)。數組


吐槽結束,開始正題~

對於這道題爲何能夠用\(Floyd\),應該就是傳遞性了。當\(A>B\)時,\(B>C\),那麼如今確定有\(A>C\)了,想一想原來的\(Floyd\),是否是也有點傳遞性的味道。這樣一來,咱們就能夠在已知一部分條件的狀況下,求出其餘值的大小關係,最後看是否是每一個數都跟其餘的每個數確認了關係,若是是,那麼這個數的位置也就出來了,也就是排好序了,不是,就輸入下一個數,直到知足每一個數都跟其餘的每個數確認了關係。若是仍是不能很好理解的話,能夠看下代碼來理解。優化

具體代碼裏面有兩個能夠優化的地方,可是數據太水,不加也能過。spa

#include <bits/stdc++.h>
using namespace std;
int n , m , T;
int dis[30][30];
int id(char x){	//字母轉化爲數字 
	return x - 'A' + 1;
}
int main(){
	cin >> n >> m;
	T = m;
	for(int i = 1; i <= n; i++) dis[i][i] = 1;	//這裏統一認爲本身大於本身(方便一點) 
	while(T--){
		char a , b , c;
		cin >> a >> b >> c;
		if(dis[id(a)][id(c)]){	//處理矛盾 
			printf("Inconsistency found after %d relations." , m - T);
			return 0;
		}
		dis[id(c)][id(a)] = 1;	//c大於a 
		for(int k = 1; k <= n; k++)
			for(int i = 1; i <= n; i++)
				for(int j = 1; j <= n; j++)
					dis[i][j] = dis[i][j] || (dis[i][k] && dis[k][j]);	//變種Floyd i>j和i>k>j均可以代表i>j 
		/*
		for(int i = 1; i <= n; i++)	上面的那個Floyd能夠這樣優化,由於咱們每次只涉及到了a和c,因此只用它們兩個更新其餘的就可 
			for(int j = 1; j <= n; j++)
				dis[i][j] = dis[i][j] || (dis[i][id(a)] && dis[id(a)][j]);
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++)
				dis[i][j] = dis[i][j] || (dis[i][id(c)] && dis[id(c)][j]);
		*/
		int f = 1;
		for(int i = 1; i <= n; i++){
			int x = 0;
			for(int j = 1; j <= n; j++)
				if(dis[i][j] || dis[j][i]) x++;	//若是肯定了與其餘n個數(包括本身)的關係,那麼就能夠肯定這個數的位置 
			if(x != n) f = 0;
		}
		if(f){
			printf("Sorted sequence determined after %d relations: " , m - T);
			for(int k = 1; k <= n; k++){	//這裏應該也能優化,設立一個vis數組,存儲當前這個數的位置,若是這個數字的位置早肯定了,那麼就不算這個數,直接算下一個數 ,具體優化操做不想寫了, 原諒個人懶惰T_T 
				for(int i = 1; i <= n; i++){
					int x = 0;
					for(int j = 1; j <= n; j++) 
						if(dis[i][j]) x++;	//最小的數只會大於一個數(它本身),第二小的數只會會大於兩個數,以此類推 
					if(x == k) cout << (char)(i + 'A' - 1);	//若是符合當前的排名,輸出 
				}
			}
			cout << ".";	//記得這個句號(6淚) 
			return 0;
		}
	}
	printf("Sorted sequence cannot be determined.");
	return 0;
}

雙倍經驗時間:code

P2419排序

相關文章
相關標籤/搜索