图论:二分图判定

摘要:
事实上,我只是想练习二分图判断,但它转向了这样一个问题。[color)return0;}elseireturn 0;}返回1;}我在14年里练习了很多次这种方法。当时,我习惯于写BFS,可能是因为所有的点都必须运行,所以这无关紧要。每个点都称为颜色,最初的cl被传递到1。当我进来时,如果点没有被染色,我会用颜色cl染色,然后判断所有边缘连接的点。如果有相同颜色的相邻点,我会直接GG。否则,我会将其染色为3-cl,这是一个小技巧。cl的值是1或2,这很方便。在判断二分图之后,发布双堆栈排序的代码。1#include<csdio>2#include<algorithm>3usingspacestd;4约束INF=1000000000;5约束最大值=1005;6intcnt,n,t1,t2;7inta[maxn],g[maxn},c[maxn][faxn]、s1[maxn]]、s2[maxn】;8structEdge{intt,next;}e[maxn*maxn];9voidaddedge10{11e[++cnt].t=v;e[cnt].next=g[u];12g[u]=cnt;13{14boolcolor15{16c[x]=cl;17for1{19if(!

我其实只是想练一练二分图判定的,但是翻到了一个这么个题。。

双栈排序早有耳闻,非常欣赏当年的出题水平,堪称经典

图论:二分图判定第1张

这个题AC的人一定是个天才

废话不多说,双栈排序的思路我就不介绍了,没有那个水平,直接来说说怎么二分图染色

bool color(int x,int cl)
{
    c[x]=cl;
    for(int tmp=g[x];tmp;tmp=e[tmp].next)
    {
        if(!c[e[tmp].t])
            {if(!color(e[tmp].t,3-cl)) return 0;}
        else if(c[e[tmp].t]==cl) return 0;
    }
    return 1;
}

这个方法,14年的时候练了很多次,当时习惯写BFS的,可能是因为所有点都要跑所以无所谓了吧

每个点都调用一次color,初始cl传1,进来的时候如果这个点没有染过色,就给它染上cl这个颜色

然后判断所有出边所连接的点,如果有相邻且同色的,直接GG

否则,染色为3-cl,这是一个小技巧,cl这时取值为1或2,十分方便

好了,二分图判定说完了,贴上双栈排序的代码跑路了

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int INF=1000000000;
 5 const int maxn=1005;
 6 int cnt,n,t1,t2;
 7 int a[maxn],g[maxn],c[maxn],f[maxn],s1[maxn],s2[maxn];
 8 struct Edge{int t,next;}e[maxn*maxn];
 9 void addedge(int u,int v)
10 {
11     e[++cnt].t=v;e[cnt].next=g[u];
12     g[u]=cnt;
13 }
14 bool color(int x,int cl)
15 {
16     c[x]=cl;
17     for(int tmp=g[x];tmp;tmp=e[tmp].next)
18     {
19         if(!c[e[tmp].t])
20             {if(!color(e[tmp].t,3-cl)) return 0;}
21         else if(c[e[tmp].t]==cl) return 0;
22     }
23     return 1;
24 }
25 int read()
26 {
27     int x=0,f=1;char ch=getchar();
28     while(ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
29     while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
30     return x*f;
31 }
32 int main()
33 {
34     n=read();
35     for(int i=1;i<=n;i++) a[i]=read();
36     f[n+1]=INF;
37     for(int i=n;i;i--) f[i]=min(f[i+1],a[i]);
38     for(int i=1;i<=n;i++)
39         for(int j=i+1;j<=n;j++)
40             if(a[i]<a[j]&&f[j+1]<a[i]) addedge(i,j),addedge(j,i);
41     for(int i=1;i<=n;i++)
42         if(!c[i])
43             if(!color(i,1)) {puts("0");return 0;}
44     int now=1;
45     for(int i=1;i<=n;i++)
46     {
47         if(c[i]==1) printf("a "),s1[++t1]=a[i];
48         else printf("c "),s2[++t2]=a[i];
49         while(s1[t1]==now||s2[t2]==now)
50         {
51             if(s1[t1]==now) printf("b "),t1--;
52             else printf("d "),t2--;
53             now++;
54         }
55     }
56     return 0;
57 }

免责声明:文章转载自《图论:二分图判定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VBA中数据库导出数据到Excel注意事项ReentrantReadWriteLock实现原理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

轮播图3D效果--roundabout(兼容IE8)升级版

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> *{ margin:0;...

模拟器上安装 Frida (Frida +FRIDA-DEXDump联动)

1.模拟器安装drozer和相关adb 。看上文。 https://www.cnblogs.com/pangya/p/10062860.html 把adb添加到环境变量。 2.模拟器上安卓Firda-server 1.确定模拟器版本,使用adb adb shell getprop ro.product.cpu.abi --查看版本 2.下载frid...

ios7 以后准确获取iphone设备的MAC(物理地址)

通过参考 钉钉 项目,知道是通过wifi拿到路由的MAC地址。那么可不可以拿到iphone 设备的MAC 地址呢? 经过一番搜索,发现所有文章都是针对 ios 7 以前 可以拿到。 而且方法也都是同一篇文章上面的,对于ios7 以后完全没提示。 而使用网络上的方法,在 大于 ios 7 的环境下, 永远返回的MAC 为02:00:00:00:00:00 下...

DD-wrt+Wiwiz搭建私人免费(收费)WiFi认证页面+详细的操作教程

系统需求硬件:已安装了DD-WRT固件的无线路由器注:DD-WRT的Wifidog功能是必须的。所以请选择正确的DD-WRT版本将无线路由器接入Internet。设置并启用无线网络,即使用无线路由器创建一个可用的Access Point。在无线路由器的Web用户界面中SSHD(或Telnet)功能。另外,需要确保:Cron服务已启用Wifidog服务已禁用...

linux下jcmd无法获取jvmdump

现象: 前两天在linux上的服务出现莫名其妙的内存溢出.却发现无法用jcmd连接jvm获取dump.现象: [root@host-12.131.14.15 bin]# ./jcmd 19652 GC.heap_dump  19652: com.sun.tools.attach.AttachNotSupportedException: Unable to...

Centos7基本命令

shell基本命令 linux命令行的组成结构 linux系统命令操作语法格式 命令 空格 参数 空格 文件路径或者需要处理的内容 rm -rf /tmp/* ls -la /home 1.一般情况下,【参数】是可选的,一些情况下【文件路径】也是可选的 2.参数》同一个命令,跟上不同的参数执行不同的功能...