Codeforces 1635 E. Cars 二分图+拓扑排序

link

题意:

坐标轴有两辆车

1第一种相向而行
2 第二种相背而行

先二分图跑出来他的方向
如果不符合直接no
再根据他的拓扑关系跑一边拓扑排序

(开了ios)输出就乱码!!!!这就是cf吧

#include <bits/stdc++.h>
using namespace  std;
#define  int long long
//typedef long long ll;
typedef pair<int,int> pii;
#define x first 
#define y second
#define pb  push_back
#define inf 1e18
#define IOS   std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define  fer(i,a,b)  for(int i=a;i<=b;i++)
#define  der(i,a,b)  for(int i=a;i>=b;i--) 
const int maxn=1e5+10;
const int mod=1e9+7;
/*ll qsm(int a,int b)
{ll res=1;  while(b){  if(b&1) res=res*a%mod;  a=a*a%mod;  b>>=1; } return res;}
*/
const int N=2e5+10;
int dr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,k;
int m;
int col[N]; 
vector<int>g[N];
int op[N];
int x[N];
int y[N];
int f;
int du[N];
vector<int>q[N];
int ans[N];
void dfs(int u)
{
     for(auto v:g[u])
     {
     	if(col[v]==col[u])
     	{
     	 f=1;	
		}
		if(col[v]==-1)
		{
			col[v]=col[u]^1;
			dfs(v);
		}
	 }
}
void solve()
{
	memset(col,-1,sizeof(col));
	cin>>n>>m;
	fer(i,1,m)
	{
	cin>>op[i]>>x[i]>>y[i];
	 g[x[i]].pb(y[i]);
	 g[y[i]].pb(x[i]);
	}
	fer(i,1,n)
	{
		if(col[i]==-1)
		col[i]=0;
		dfs(i);
	}
	if(f){
		printf("NO\n");
		return ;
	}
	fer(i,1,m)
	{
		if(col[x[i]]) swap(x[i],y[i]);
		if(op[i]==1) q[x[i]].pb(y[i]) ,du[y[i]]++;
		else q[y[i]].pb(x[i]),du[x[i]]++;
	}
	queue<int>t;
	fer(i,1,n) if(!du[i])t.push(i);
	int cnt=0;
	while(!t.empty())
	{
		int u=t.front();
		t.pop();
		ans[u]=++cnt;
		for(auto v:q[u])
		{
			du[v]--;
			if(!du[v])t.push(v);
		}
	}
	if(cnt!=n){
	printf("NO\n");
		return ;
	} 
	printf("YES\n");
	fer(i,1,n)
	{
		cout<<(col[i]?"R":"L")<<" "<<ans[i]<<endl;
	}	
}
signed main()
{
//	IOS;
	int _=1;
	//cin>>_;
	while(_--) solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值