這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq...
令dis[x]表示x的相對大小(1是最小,n是最大),顯然,對於乙個關係a
而我們最後要求的就是dis[x]的最小值,為了使它們的值都落在1~n之間,我們新建乙個虛擬的點0,並令dis[0]=0且dis[x]>dis[0].
這樣我們要求的就是dis[x]-dis[0]的最小值啦~\(≧▽≦)/~.
顯然這可以轉換為乙個圖論問題(也就是最長路),我比較喜歡用最短路,所以把它轉化一下變成-(dis[0]-dis[x]).
dis[0]-dis[x]就是x到0的最短路,我們可以把它轉變成乙個單源最短路,就是建反向邊,跑乙個以0為起點的單源最短路就可以啦,最後記得取相反數哦
#includeusingnamespace
std;
const
int maxn=1005
;int n,m,dis[maxn],in
[maxn],cnt[maxn],head[maxn],eps,tot,vis[maxn];
struct
edge
e[maxn];
deque
q;inline
intread()
while(ch>='
0'&&ch<='9'
)
return x*f;
}inline
void write(int
a)
else
}void add(int to,int
from,int
quan)
; head[
from]=tot;
}int spfa(int
s) }
//cout<<"to "<}
}for(int i=1;i<=n;++i)
vis[-dis[i]]=1
;
for(int i=1;i<=n;++i)
if(!vis[i])
return -1
;
return1;
}int
main()
else
if(flag>0
)
putchar('.
');return0;}}
printf(
"sorted sequence cannot be determined.");
return0;
}
洛谷 P1347 排序 拓撲排序
題目 乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列a,b,c,d 表示a第一行有兩個整數n,m,n表示需要排序的元素數量,2 n 26,第1到n個元素將用大寫的a,b,c,d 表示。m表示將給出的形如a接下來有m行,每行有3個字元,分別為乙個大寫字母,乙個 ...
洛谷 P1347 排序 拓撲排序
乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列 a,b,c,da,b,c,da,b,c,d 表示a abc d。在這道題中,我們將給你一系列形如 a a b 的關係,並要求你判斷是否能夠根據這些關係確定這個數列的順序。第一行有兩個正整數 n,mn,mn,m,n...
P1347 排序(拓撲排序)
題目傳送門 這題雖然是一道藍題,但他的資料很小,所以,我們可以每輸入乙個關係就拓撲一次 我們可以把結果分為三種情況 這裡我們可以用拓撲把度清零,記錄每個字母都出現過 並且判斷最長的鏈是多少就行了 即f a i to max f a i to f p h 1 找最長鏈 s max s,f a i to...