Portal:http://codeforces.com/problemset/problem/506/B

    http://codeforces.com/problemset/problem/505/D 

好题

给n个城市,m条有向边,求出最少的有向边使得其构成的图与原图等势

对于每个连通分量:

如果无环,那么只需要需要n-1条边完成联通

如果有环,则只需要n条边完成联通

所以这题只要判下连通分量,再看有几个连通分量有环即可

解法一:无向图遍历求强连通分量再把强连通分量所代表的联通分量dfs判环,如下

Memory: 10440 KB   Time: 498 MS
 #include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define FORD(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
#define SZ(x) int(x.size())
#define maxn 100010
int n,m,x,y;
bool circle=true;
int vis[maxn],vis2[maxn];
vector<int> neg[maxn],adj[maxn];
vector<int> dot;
void ndfs(int start)
{
dot.push_back(start);
vis[start]=;
FOR(i,,SZ(neg[start])-)
{
if(!vis[neg[start][i]]) ndfs(neg[start][i]); }
return;
}
void adfs(int start)
{
vis2[start]=;
FOR(i,,SZ(adj[start])-)
{
if(!vis2[adj[start][i]]) adfs(adj[start][i]);
else if(vis2[adj[start][i]]==)circle=false;
}
vis2[start]=;
return;
}
int main()
{
cin>>n>>m;
FOR(i,,m)
{
cin>>x>>y;
neg[x].push_back(y);
neg[y].push_back(x);
adj[x].push_back(y);
}
int ans=n;
FOR(i,,n)
{
circle=;
if(!vis[i])
{
dot.clear();
ndfs(i);
FOR(i,,SZ(dot)-)
if (!vis2[dot[i]]) adfs(dot[i]);
ans-=circle;
}
}
cout<<ans<<endl;
return ;
}

我在想函数名字到底取afs好还是adfs好

解法二:在无向图中维护并查集求强连通分量再把强连通分量所代表的联通分量用拓扑排序判环,如下

Memory: 7820 KB   Time: 514 MS
 #include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define FORD(i,j,k) for(int i=j;i>=k;i--)
#define LL long long
#define SZ(x) int(x.size())
#define maxn 100010
vector<int> G[maxn];
int n,m,x,y,T;
int father[maxn],val[maxn],circle[maxn],vis[maxn],clock[maxn];
int setfind(int x)
{
int fa=father[x];
if(fa==x) return x;
else return father[x]=setfind(fa);
}
void setunion(int x,int y)
{
int X=setfind(x);
int Y=setfind(y);
if(X==Y) return;
if(val[X]>val[Y]) father[Y]=X;
else father[X]=Y;
if(val[X]==val[Y]) val[X]++;
return;
}
void dfs(int start)
{
vis[start]=;
FOR(i,,SZ(G[start])-)
if(!vis[G[start][i]]) dfs(G[start][i]);
clock[start]=++T;
return;
}
int main()
{
cin>>n>>m;
FOR(i,,n)
{father[i]=i;val[i]=;}
FOR(i,,m)
{
cin>>x>>y;
G[x].push_back(y);
setunion(x,y);
}
FOR(i,,n)
if(!vis[i]) dfs(i);
FOR(i,,n)
FOR(j,,SZ(G[i])-)
if(clock[i]<clock[G[i][j]]) circle[setfind(i)]=;
int ans=n;
FOR(i,,n)
if(i==setfind(i))if(!circle[setfind(i)]) ans--;
cout<<ans<<endl;
return ;
}

Mr. Kitayuta's Black Technology

其实求连通分量还可以用染色

  判有向环可以用并查集乱搞

反正就是怎么搞都能过

CodeForces 506B/505D Mr. Kitayuta's Technology的更多相关文章

  1. codeforces 505C C. Mr. Kitayuta, the Treasure Hunter(dp)

    题目链接: C. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 me ...

  2. 【codeforces 505D】Mr. Kitayuta's Technology

    [题目链接]:http://codeforces.com/problemset/problem/505/D [题意] 让你构造一张有向图; n个点; 以及所要求的m对联通关系(xi,yi) 即要求这张 ...

  3. [CF#286 Div2 D]Mr. Kitayuta's Technology(结论题)

    题目:http://codeforces.com/contest/505/problem/D 题目大意:就是给你一个n个点的图,然后你要在图中加入尽量少的有向边,满足所有要求(x,y),即从x可以走到 ...

  4. 【CF505D】Mr. Kitayuta's Technology

    题目大意: 在一个有向图中,有n个顶点,给出m对数字(u,v)表示顶点u和顶点v必须直接或者间接相连,让你构造一个这样的图,输出最少需要多少条边. 挖坑待填 官方题解链接:http://codefor ...

  5. codeforce 505 D. Mr. Kitayuta's Technology(tarjan+并查集)

    题目链接:http://codeforces.com/contest/505/problem/D 题解:先用tarjan缩点然后再用并查集注意下面这种情况 ‘ 这种情况只需要构成一个大环就行了,也就是 ...

  6. 【codeforces 505C】Mr.Kitayuta,the Treasure Hunter

    [题目链接]:http://codeforces.com/problemset/problem/505/C [题意] 一开始你跳一步长度为d; 之后你每步能跳d-1,d,d+1这3种步数; 然后在路上 ...

  7. Codeforces 505 A Mr. Kitayuta's Gift【暴力】

    题意:给出一个字符串,可以向该字符串的任意位置插入一个字母使其变成回文串 因为字符串的长度小于10,枚举插入的字母,和要插入的位置,再判断是否已经满足回文串 #include<iostream& ...

  8. 【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黄昏下的礼物 dp转有限状态自动机+矩阵乘法优化

    神题……胡乱讲述一下思维过程……首先,读懂题.然后,转化问题为构造一个长度为|T|+n的字符串,使其内含有T这个子序列.之后,想到一个简单的dp.由于是回文串,我们就增量构造半个回文串,设f(i,j, ...

  9. CodeForces 505B Mr. Kitayuta's Colorful Graph

    Mr. Kitayuta's Colorful Graph Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

随机推荐

  1. DIV的失去焦点(blur)实现

    用防抖实现DIV鼠标移出消失   由于div标签本身不支持onblur事件,所以对于点击一个按钮弹出的div,我们想要当这个div失去焦点的时候,让它消失不能使用的onblur来实现.  但是可以利用 ...

  2. 前端每日实战:4# 视频演示如何用纯 CSS 创作一个金属光泽 3D 按钮特效

    效果预览 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/full/MGeRRO 可交互视频教程 此视频是可以 ...

  3. 3,Java中的文件IO流

    1,File类 ··· 概念:File对象可以表示一个文件或目录.可以对其进行增删改查. ··· 常用方法:     File f = new File(".");     判断是 ...

  4. 第三章、vue基础精讲

    3.1VUE实例 组件:全局组件,局部组件,vue的每个组件也是一个实例,有自己的实例属性和实例方法. 在console中调试vue,vm为vue的实例,凡是以$开头的都是vue的实例属性或者vue的 ...

  5. javascript的constructor属性介绍

    之前闲来了解了__proto__和prototype的区别,每个对象都有隐私属性__proto__,而prototype是javascript函数特有的属性.那么constructor属性呢?最近是遇 ...

  6. php+apache 环境配置(window环境)

    最近,小主从事PHP开发.特将最近如何搭建php7的过程记录在此!希望有需要,可以借鉴!( 电脑必须win7 sp1以上, .netframework4 ) Windows7安装php7,Win7+p ...

  7. MySQL使用前查看状态

    1.检查MySQL服务器是否启动:ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql进程列表,如下所示:mysql下一行 如果mysql未启动,你可以使用以下命 ...

  8. [android]R.class里有ID,onCreate方法里调用findViewById返回空

    在做android练习,一个新手错误,记录一下: 在练习android权威编程指南时,第5章 第二个Activity部分练习,出现标题问题,代码还原如下: protected void onCreat ...

  9. 【牛客】乃爱与城市拥挤程度 — 树形dp,up and down

    我太难了 这题做得我要死了,来来回回写了大概八九个小时 错误的原因要么是快速幂写错(一生之敌,要么是忘取模爆\(longlong\)变负数\(QAQ\) \(update\) \(2019.11.13 ...

  10. git命令,github网站以及sourceTree用法详解

    1.git下载安装 这里只是windows安装方法: 进入这个网址:http://msysgit.github.com/,点击下载,就会下载下来一个exe文件,双击打开,安装即可 完成安装之后,就可以 ...