POJ 3683 2-sat
阿新 • • 發佈:2019-01-30
題意:給了n個人的結婚時間,然後要有一個D的時間完成一個特殊活動,這個活動只能在開始或者結束之前完成,牧師需要主持這個特殊活動,問牧師是否可以主持n個活動不衝突,若可以輸出一種可能的情況
思路:挑戰程式設計上的例題,對於活動A和B來說,若A開始B開始衝突的話,那麼!A V !B為真,然後還有開始和結束,結束和開始,結束和結束這四種情況的式子,然後連邊跑scc即可,然後輸出的時候cmp[A]>cmp[A+n]代表開始的時候開始特殊活動,另一個是另一種情況
#include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3fll; const int maxn=2010; int V; vector<int>G[maxn],rG[maxn],vs; bool used[maxn]; int cmp[maxn]; void add_edge(int from,int to){ G[from].push_back(to); rG[to].push_back(from); } void dfs(int v){ used[v]=1; for(unsigned int i=0;i<G[v].size();i++){ if(!used[G[v][i]]) dfs(G[v][i]); } vs.push_back(v); } void rdfs(int v,int k){ used[v]=1; cmp[v]=k; for(unsigned int i=0;i<rG[v].size();i++){ if(!used[rG[v][i]]) rdfs(rG[v][i],k); } } int scc(){ memset(used,0,sizeof(used)); vs.clear(); for(int v=0;v<V;v++){ if(!used[v]) dfs(v); } memset(used,0,sizeof(used)); int sum=0; for(int i=vs.size()-1;i>=0;i--){ if(!used[vs[i]]) rdfs(vs[i],sum++); } return sum; } int S[maxn],T[maxn],D[maxn]; int main(){ int n; int ch1,ch2,ch3,ch4; while(scanf("%d",&n)!=-1){ for(int i=0;i<maxn;i++) G[i].clear(),rG[i].clear(); for(int i=0;i<n;i++){ scanf("%d:%d%d:%d%d",&ch1,&ch2,&ch3,&ch4,&D[i]); S[i]=ch1*60+ch2; T[i]=ch3*60+ch4; } V=2*n; for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(min(S[i]+D[i],S[j]+D[j])>max(S[i],S[j])){ add_edge(i,j+n);add_edge(j,i+n); } if(min(S[i]+D[i],T[j])>max(S[i],T[j]-D[j])){ add_edge(i,j);add_edge(j+n,i+n); } if(min(T[i],S[j]+D[j])>max(T[i]-D[i],S[j])){ add_edge(i+n,j+n);add_edge(j,i); } if(min(T[i],T[j])>max(T[i]-D[i],T[j]-D[j])){ add_edge(i+n,j);add_edge(j+n,i); } } } scc(); int flag=0; for(int i=0;i<n;i++) if(cmp[i]==cmp[i+n]) flag=1; if(flag==1) printf("NO\n"); else{ printf("YES\n"); for(int i=0;i<n;i++){ if(cmp[i]>cmp[i+n]){ printf("%02d:%02d %02d:%02d\n",S[i]/60,S[i]%60,(S[i]+D[i])/60,(S[i]+D[i])%60); }else{ printf("%02d:%02d %02d:%02d\n",(T[i]-D[i])/60,(T[i]-D[i])%60,T[i]/60,T[i]%60); } } } } return 0; }