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;
}

posted on 2011-03-19 20:48  宇宙吾心  阅读(594)  评论(0)    收藏  举报

导航