poj 3683
艰难的ac。
代码:
#include<iostream> #include<fstream> #include<vector> using namespace std; vector<int> edge[2001],edge2[2001]; int n,m; int v[2001],low[2001],dfn[2001],stack[2001],scc[2001],tot,index,top; void tarjan(int s){ int i,j,k; dfn[s]=low[s]=++index; stack[++top]=s; v[s]=1; for(i=0;i<edge[s].size();i++) { k=edge[s][i]; if(dfn[k]==0) { tarjan(k); low[s]=min(low[s],low[k]); } else if(v[k]) { low[s]=min(low[s],dfn[k]); } } if(low[s]==dfn[s]){ ++tot; do{ i=stack[top--]; scc[i]=tot; v[i]=0; }while(i!=s); } } void solve(){ int i,j,k; index=0;tot=0;top=0; memset(v,0,sizeof(v)); memset(dfn,0,sizeof(dfn)); for(i=1;i<=2*n;i++) if(dfn[i]==0) tarjan(i); } void build(){ int i,j,k; for(i=1;i<=2*n;i++) { for(j=0;j<edge[i].size();j++) { k=edge[i][j]; if(scc[k]!=scc[i]) { edge2[scc[k]].push_back(scc[i]); } } } } int queue[2001]; void dfs(int s){ int i,j,k; v[s]=1; for(i=0;i<edge2[s].size();i++) { k=edge2[s][i]; if(v[k]==0) dfs(k); } queue[top++]=s; } int ant[2001]; int d[2001],b[2001]; void solve1(){ int i,j,k,s; for(i=1;i<=n;i++) { ant[scc[i]]=scc[i+n]; ant[scc[i+n]]=scc[i]; } build(); top=0; for(i=1;i<=tot;i++) if(v[i]==0) dfs(i); memset(v,0,sizeof(v)); for(i=top-1;i>=0;i--) { j=queue[i]; if(v[j]==0) { v[j]=1; v[ant[j]]=2; j=ant[j]; for(s=0;s<edge2[j].size();s++) { k=edge2[j][s]; v[k]=2; } } } for(i=1;i<=n;i++) { if(v[scc[i]]!=1) s=i+n; else s=i; j=b[s]/60; k=b[s]%60; printf("%02d:%02d ",j,k); j=(b[s]+d[s])/60; k=(b[s]+d[s])%60; printf("%02d:%02d\n",j,k); } } void read(){ // ifstream cin("in.txt"); int i,j,k,s,t; // cin>>n; scanf("%d",&n); char c; for(i=1;i<=n;i++) { // cin>>j>>c>>k; scanf("%d:%d",&j,&k); b[i]=j*60+k; // cin>>j>>c>>k; scanf("%d:%d",&j,&k); // cin>>d[i]; scanf("%d",&d[i]); d[i+n]=d[i]; b[i+n]=j*60+k-d[i]; ant[i]=i+n; ant[i+n]=i; } for(s=1;s<=2*n;s++) for(t=1;t<=2*n;t++) if(s!=t&&s!=t+n&&t!=s+n) { if((b[t]>=b[s]&&b[s]+d[s]>b[t])||(b[s]>=b[t]&&b[s]<b[t]+d[t])) { edge[s].push_back(ant[t]); } } solve(); for(i=1;i<=n;i++) if(scc[i]==scc[i+n]) break; if(i<=n) { cout<<"NO"<<endl; } else { cout<<"YES"<<endl; solve1(); } } int main(){ read(); return 0; }