日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CF 1635E Cars 二分图 + 拓扑

發(fā)布時(shí)間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF 1635E Cars 二分图 + 拓扑 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 題意
  • 思路

傳送門

題意

給你nnn個(gè)點(diǎn),需要給每個(gè)點(diǎn)定向,方向可以向右或者向左,定向之后點(diǎn)會(huì)朝選擇的方向移動(dòng),要求滿足mmm個(gè)條件,兩種不同的條件如下:

  • i,ji,ji,j兩個(gè)位置定向之后移動(dòng)不會(huì)相遇。
  • i,ji,ji,j兩個(gè)位置定向之后一定會(huì)相遇。
  • 如果不能滿足輸出NONONO,否則輸出YESYESYES,并且給出定向之后的點(diǎn)的方向和位置。

    思路

    考慮兩種情況的方向如何選擇,首先他們兩個(gè)位置一定選擇不同的方向,讓后根據(jù)是否相遇來(lái)調(diào)整他們的位置。那么根據(jù)第一個(gè)條件,我們給i,ji,ji,j連無(wú)向邊,那么有解的第一個(gè)條件就比較顯然了,就是這個(gè)構(gòu)成的圖是二分圖,讓后現(xiàn)在他們的方向確定了,接下來(lái)需要確認(rèn)他們的位置,我們分兩種情況來(lái)討論分別對(duì)應(yīng)題目的兩種情況:

  • 假設(shè)iii位置取LLLjjj位置取RRR,由于他們不會(huì)相遇,那么xi<xjx_i<x_jxi?<xj?
  • 假設(shè)iii位置取LLLjjj位置取RRR,由于他們會(huì)相遇,那么xi>xjx_i>x_jxi?>xj?
  • 看到大于號(hào),需要跟拓?fù)湫蚵?lián)系起來(lái),那么我們就按照從小到大的位置來(lái)填,連邊就按照上面的小的連大的,最終判斷是否存在環(huán)即可。

    復(fù)雜度O(n+m)O(n+m)O(n+m)

    #include<bits/stdc++.h> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define Mid (tr[u].l+tr[u].r>>1) #define pb push_back using namespace std;const int N=1000010,INF=0x3f3f3f3f,mod=1e9+7; typedef long long LL;int n,m; vector<int>v[N]; bool flag; int col[N],d[N]; int st[N]; struct Node {int x,y,z; }p[N]; struct node {char ch;int pos; }ans[N];void dfs(int u,int c) {col[u]=c;st[u]=0;for(auto x:v[u]) {if(col[x]) {if(col[x]==c) flag=false;continue;}dfs(x,3-c);} }char get(int pos) {if(col[pos]==0) return 'L';if(col[pos]==1) return 'R';else return 'L'; }void solve() {flag=true;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) {int a,b,c; scanf("%d%d%d",&a,&b,&c);v[b].pb(c);v[c].pb(b);p[i]={a,b,c};}for(int i=1;i<=n;i++) if(!col[i]) dfs(i,1);if(!flag) {puts("NO");return;}for(int i=1;i<=n;i++) v[i].clear();for(int i=1;i<=m;i++) {int x,y,z;x=p[i].x,y=p[i].y,z=p[i].z;if(x==2) {if(col[y]==1) d[z]++,v[y].pb(z);else d[y]++,v[z].pb(y);} else {if(col[y]==2) d[z]++,v[y].pb(z);else d[y]++,v[z].pb(y);}}queue<int>q;int pos=0;for(int i=1;i<=n;i++) if(!d[i]) q.push(i);while(q.size()) {int u=q.front(); q.pop();ans[u]={get(u),pos++};for(auto x:v[u]) {if(--d[x]==0) {q.push(x);}}}for(int i=1;i<=n;i++) if(d[i]) {puts("NO");return;}puts("YES");for(int i=1;i<=n;i++) {printf("%c %d\n",ans[i].ch,ans[i].pos);} }int main() {int _=1;while(_--) {solve();}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的CF 1635E Cars 二分图 + 拓扑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。