COJ 3012 LZJ的问题 (有向图判环)
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1042
试题描述:
LZJ有一个问题想问问大家。他在写函数时有时候很头疼,如他写了这样几个函数:
void f1()
{
f2();
f3();
}
void f2()
{
f3();
}
void f3()
{
f1();
}
LZJ发现他无论怎么调换函数的位置,编译器总是不能通过编译,因为编译器规定调用的函数必须在当前函数之前写。
还有一种情况是这样的:
void f4()
{
f4();
}
虽然能通过编译但会无限递归。
现在LZJ想问问你,他写了一些函数,并且给你每个函数调用了哪些别的函数(可能调用本身),请问他能否通过调整函数的位置,使得编译器通过编译且不会出现无限递归?
输入:
输入第一行为一个正整数N,表示有N个函数。
接下来N行每第i行开始有一个自然数K,表示第i个函数共调用了多少别的函数(可能调用本身),接下来K个正整数vij,表示函数i调用了函数vij。
输出:
若可以输出“Yes”,否则输出“No”。
输入示例:
5
1 2
1 3
2 4 5
1 5
0
输出示例:
Yes
其他说明:
1<=N<=200,1<=K<=N, 1<=vij<=N
题解:裸有向图判环直接拓扑排序,然后如果作死可以把边搞成负的上Bellman_Ford……
然后记得判自环。
拓扑排序:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#define REP(s, n) for(int i = s; i <= n; i ++)
using namespace std;
const int maxn = + ;
const int maxm = + ;
int In[maxn], n, cnt = ;
int first[maxn], next[maxm], to[maxm];
bool vis[maxn], TAT = true;
int ms = ;
void AddEdge(int u, int v){
next[ms] = first[u];
first[u] = ms;
to[ms] = v;
In[v] ++; ms ++;
return ;
}
void read(int& x){
x = ; int sig = ; char ch = getchar();
while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
while(isdigit(ch)) x = * x + ch -'', ch = getchar();
x *= sig; return ;
}
queue<int> Q;
void init(){
read(n);
int temp;
REP(, n){
read(cnt);
while(cnt --){
read(temp);
if(temp == i) { TAT = false; return ; }
AddEdge(i, temp);
}
}
return ;
}
void work(){
if(!TAT) return ;
REP(, n) if(In[i] == ) Q.push(i), vis[i] = true;
while(!Q.empty()){
int x = Q.front(); Q.pop();
for(int i = first[x]; i; i = next[i]){
int& v = to[i];
if(vis[v]) continue;
In[v] --;
if(In[v] == ) Q.push(v), vis[v] = true;
}
}
return ;
}
void print(){
if(!TAT) { puts("No"); return ;}
REP(, n) if(!vis[i]) { puts("No"); return ;}
puts("Yes"); return ;
}
int main(){
init();
work();
print();
return ;
}
Bellman_Ford:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define INF 1000000000
using namespace std;
const int maxn=+,maxm=+;
struct Tedge{int x,y,w,next;}adj[maxm];int ms=,fch[maxn];
void AddEdge(int u,int v){
adj[++ms]=(Tedge){u,v,-,fch[u]};fch[u]=ms;return;
}
int d[maxn],n;
bool relax(int u,int v,int w){
if(d[v]>d[u]+w){d[v]=d[u]+w;return true;}
return false;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){ }
bool bellman_ford(){
n=read();
for(int i=;i<=n;i++) d[i]=INF;
for(int i=;i<=n;i++){
int k=read();
for(int j=;j<k;j++){
int a=read();
if(i==a) return false;
AddEdge(i,a);
}
}
bool ToT;
for(int i=;i<=n;i++){
ToT=false;
for(int i=;i<=ms;i++){
int u=adj[i].x,v=adj[i].y,w=adj[i].w;
if(relax(u,v,w)) ToT=true;
}
if(!ToT) break;
}
for(int i=;i<=ms;i++){
int u=adj[i].x,v=adj[i].y,w=adj[i].w;
if(relax(u,v,w)) return false;
}
return true;
}
void work(){
if(bellman_ford()) puts("Yes");
else puts("No");
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
/*
5
1 1
1 3
1 4
1 5
1 6
*/
Spfa:超级点向所有点引0再跑
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#define inf 100000000
using namespace std;
const int maxn=+,maxm=+;
struct Tedge{int x,y,w,next;}adj[maxm];int ms=,fch[maxn];
void AddEdge(int u,int v,int w){adj[++ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms;return;}
int n;
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;} if(x<) putchar('-'),x=-x;
int len=,buf[]; while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
bool inque[maxn];
int d[maxn],cnt[maxn];
bool SPFA(int S){
for(int i=;i<=n+;i++) d[i]=inf;
queue<int>Q;Q.push(S);inque[S]=true;d[S]=;
while(!Q.empty()){
int u=Q.front();Q.pop();inque[u]=false;
for(int i=fch[u];i;i=adj[i].next){
int v=adj[i].y;
if(d[v]>d[u]+adj[i].w){
d[v]=d[u]+adj[i].w;
if(!inque[v]){
if(++cnt[v]>=n+) return false;
inque[v]=true;
Q.push(v);
}
}
}
}return true;
}
void init(){
n=read();
for(int i=;i<=n;i++){
AddEdge(n+,i,);
int tp=read();
for(int j=;j<=tp;j++){
int v=read();
if(v==i){puts("No");return;}
AddEdge(i,v,-);
}
}
//for(int i=1;i<=ms;i++) printf("%d %d %d\n",adj[i].x,adj[i].y,adj[i].w);
if(SPFA(n+)) puts("Yes");
else puts("No");
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
COJ 3012 LZJ的问题 (有向图判环)的更多相关文章
- Dwarves (有向图判环)
Dwarves 时间限制: 1 Sec 内存限制: 64 MB提交: 14 解决: 4[提交][状态][讨论版] 题目描述 Once upon a time, there arose a huge ...
- HDU 3342 Legal or Not(有向图判环 拓扑排序)
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 5154 Harry and Magical Computer 有向图判环
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...
- CodeForces 937D 936B Sleepy Game 有向图判环,拆点,DFS
题意: 一种游戏,2个人轮流控制棋子在一块有向图上移动,每次移动一条边,不能移动的人为输,无限循环则为平局,棋子初始位置为$S$ 现在有一个人可以同时控制两个玩家,问是否能使得第一个人必胜,并输出一个 ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)
D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- CodeForces-1217D (拓扑排序/dfs 判环)
题意 https://vjudge.net/problem/CodeForces-1217D 请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量. 思路 因为是有向图,每个环两 ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
- hdu4888 Redraw Beautiful Drawings 最大流+判环
hdu4888 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/6553 ...
随机推荐
- Nginx优化具体,应对高并发
nginx指令中的优化(配置文件) worker_processes 8; nginx进程数,建议依照cpu数目来指定.一般为它的倍数. worker_cpu_affinity 00000001 ...
- Android开发艺术探索》读书笔记 (12) 第12章 Bitmap的加载和Cache
第12章 Bitmap的加载和Cache 12.1 Bitmap的高速加载 (1)Bitmap是如何加载的?BitmapFactory类提供了四类方法:decodeFile.decodeResourc ...
- LeanCloud使用入门(android)
LeanCloud算是一个简单易用的云服务器,其中包含了强大的数据库支持,我们只需要将此服务器应用到本地的代码即可实现后台的存储与交互. 那么,如何简单实现本地代码和LeanCloud服务器的交互呢? ...
- POJ 1696 Space Ant 卷包裹法
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3316 Accepted: 2118 Descrip ...
- .net之页面生面周期
# 事件或方法 功能 描述 1 Init 事件 页面初始化 页面生存周期中的第一个阶段是初始化.当 Init 事件发生时,在.aspx 源文件中静态声明的所有控件都已实例化并取其默认值.应该注意的是, ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- Android Xutils 框架
XUtils是git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍: 鉴于大家的热情,我又写了一篇Android 最火框架XUtils之注解机 ...
- .net框架介绍
.net 一般指 .net Framework框架,是一种平台,一种技术 C# 是一种编程语言,可以开发基于.net平台的应用 Java 既是一种技术,也是一种语言 .net可以开发桌面应用程序 ...
- urlwrite伪静态(SAE、PHP、JSP)
在SAE里,直接配置config.yaml文件,文件可以配置的内容包含: 目录默认页面 自定义错误页面 压缩 页面重定向 页面过期 设置响应Header的Content-Type appname: x ...
- 关于php优化的方法
1. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row[’id’] 的速度是$row[id]的7倍.3.echo 比 print快,并且使用echo的 ...