CodeForces 506B/505D Mr. Kitayuta's Technology
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的更多相关文章
- 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 ...
- 【codeforces 505D】Mr. Kitayuta's Technology
[题目链接]:http://codeforces.com/problemset/problem/505/D [题意] 让你构造一张有向图; n个点; 以及所要求的m对联通关系(xi,yi) 即要求这张 ...
- [CF#286 Div2 D]Mr. Kitayuta's Technology(结论题)
题目:http://codeforces.com/contest/505/problem/D 题目大意:就是给你一个n个点的图,然后你要在图中加入尽量少的有向边,满足所有要求(x,y),即从x可以走到 ...
- 【CF505D】Mr. Kitayuta's Technology
题目大意: 在一个有向图中,有n个顶点,给出m对数字(u,v)表示顶点u和顶点v必须直接或者间接相连,让你构造一个这样的图,输出最少需要多少条边. 挖坑待填 官方题解链接:http://codefor ...
- codeforce 505 D. Mr. Kitayuta's Technology(tarjan+并查集)
题目链接:http://codeforces.com/contest/505/problem/D 题解:先用tarjan缩点然后再用并查集注意下面这种情况 ‘ 这种情况只需要构成一个大环就行了,也就是 ...
- 【codeforces 505C】Mr.Kitayuta,the Treasure Hunter
[题目链接]:http://codeforces.com/problemset/problem/505/C [题意] 一开始你跳一步长度为d; 之后你每步能跳d-1,d,d+1这3种步数; 然后在路上 ...
- Codeforces 505 A Mr. Kitayuta's Gift【暴力】
题意:给出一个字符串,可以向该字符串的任意位置插入一个字母使其变成回文串 因为字符串的长度小于10,枚举插入的字母,和要插入的位置,再判断是否已经满足回文串 #include<iostream& ...
- 【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黄昏下的礼物 dp转有限状态自动机+矩阵乘法优化
神题……胡乱讲述一下思维过程……首先,读懂题.然后,转化问题为构造一个长度为|T|+n的字符串,使其内含有T这个子序列.之后,想到一个简单的dp.由于是回文串,我们就增量构造半个回文串,设f(i,j, ...
- CodeForces 505B Mr. Kitayuta's Colorful Graph
Mr. Kitayuta's Colorful Graph Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d ...
随机推荐
- Java多态实现的机制
Java提供了编译时多态和运行时多态两种多态机制.前者是通过方法重载实现的,后者是通过方法的覆盖实现的. 在方法覆盖中,子类可以覆盖父类的方法,因此同类的方法会在父类与子类中有着不同的表现形式. 在J ...
- 如何优雅的把后台数据(通常是JSON)轻松渲染到html页面
如何优雅的把后台数据(通常是JSON)轻松渲染到html页面 在我们做前后端分离的时候,都有遇到过一些看起卡很简答,确无从下手的问题把.比方说后台给了前端一个list集合,集合里面有很多学生,我们现在 ...
- seo搜索优化教程09 - seo搜索优化外链优化
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第九课 网络营销推广中有句行话,叫做"内容为王,外链为王",可见外链对于 ...
- socket TCP 从0实现音频传输 ALSA 播放
RTP标准是采用 UDP 发送,有不少现成的开源库,但不在本文讨论的范围内.UDP 用户数据报,不提供流程,安全传输的功能,但速度快,能提供多播,广播,没有序列号 SEQ ,有 MTU 限制,1500 ...
- 【tomcat系列】详解tomcat架构(上篇)
java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...
- MySQL 【教程二】
MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: # CREATE TABLE table_name (c ...
- asp.net core 3.x 微信小程序登录库(也可用于abp)
视频教程(使用+实现原理):https://share.weiyun.com/57HKopT 建议直接看视频 源码地址:https://github.com/bxjg1987/abpGeneralMo ...
- .NetCore 3.1 MVC 发布Linux实操
记录自己.net Core的学习,现在来发布到Linux系统 第一步:准备一台CentOS 7 X64服务器 .net core 3.1项目 第二步:准备服务器.net core环境 1.安装微软官方 ...
- MyBatis框架——快速入门
主流的ORM框架(帮助开发者实现数据持久化工作的框架): 1.MyBatis: 半自动化ORM框架,半自动:指框架只完成一部分功能,剩下的工作仍需开发者手动完成. MyBatis 框架没有实现 POJ ...
- VUE axios请求 封装 get post Http
创建httpService.js 文件 import axios from 'axios'; import { Loading , Message } from 'element-ui'; impor ...