生活随笔
收集整理的這篇文章主要介紹了
HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
link
題意:
首先看到排名自然想到拓?fù)湫?#xff0c;但是存在等于的情況,這就啟發(fā)我們把等于的情況縮成一個(gè)點(diǎn),讓后在縮點(diǎn)后的圖中進(jìn)行拓?fù)浼纯伞?br /> 對(duì)于不合法的情況當(dāng)然是拓?fù)湫驔]有遍歷到應(yīng)該遍歷的點(diǎn),所以只需要檢查遍歷了幾個(gè)點(diǎn)即可。對(duì)于信息不全的情況,那就是對(duì)應(yīng)同一級(jí)存在多個(gè)點(diǎn),所以只需要判斷隊(duì)列是否恒為一個(gè)元素即可(當(dāng)然這種說法不嚴(yán)謹(jǐn))。
最后如果用并查集縮點(diǎn)的話,一定要注意判斷 i == find(i) ,因?yàn)榭s完點(diǎn)之后這個(gè)點(diǎn)就是這個(gè)集合的代表。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=100010,M
=N
*2,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
;
int e
[M
],ne
[M
],h
[N
],idx
;
int p
[N
],tot
;
int d
[N
];
bool st
[N
];
struct Query
{int a
,b
;char op
;
}q
[N
];void add(int a
,int b
)
{e
[idx
]=b
,ne
[idx
]=h
[a
],h
[a
]=idx
++;
}int find(int x
)
{return x
==p
[x
]? x
:p
[x
]=find(p
[x
]);
}int topsort()
{int sum
=0,s
=0;int f1
,f2
; f1
=f2
=0;queue
<int>q
;for(int i
=0;i
<n
;i
++) if(!d
[i
]&&i
==find(i
)) q
.push(i
),s
++; else if(i
==find(i
)) s
++;if(q
.size()>1) f1
=1;while(q
.size()){int cnt
=0; sum
++;int u
=q
.front(); q
.pop();for(int i
=h
[u
];~i
;i
=ne
[i
]){int j
=e
[i
];if(--d
[j
]==0) q
.push(j
),cnt
++;}if(cnt
>1) f1
=1;}if(sum
!=s
) f2
=1;if(f1
&&f2
) return 2;else if(f2
) return 2;else if(f1
) return 1;else return 0;
}int main()
{
while(scanf("%d%d",&n
,&m
)!=EOF){idx
=0; tot
=0;for(int i
=0;i
<n
;i
++) p
[i
]=i
,h
[i
]=-1,d
[i
]=0,st
[i
]=0;for(int i
=1;i
<=m
;i
++){int a
,b
; char op
[2];scanf("%d%s%d",&a
,op
,&b
);if(*op
=='=') p
[find(a
)]=find(b
);else q
[++tot
]={a
,b
,op
[0]};}for(int i
=1;i
<=tot
;i
++){int a
=q
[i
].a
,b
=q
[i
].b
;st
[a
]=1; st
[b
]=1;char op
=q
[i
].op
;a
=find(a
); b
=find(b
);if(op
=='>') d
[a
]++,add(b
,a
);else d
[b
]++,add(a
,b
);}int t
=topsort();if(t
==2) puts("CONFLICT");else if(t
==1) puts("UNCERTAIN");else puts("OK");}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。