POJ 1778 All Discs Considered(拓扑排序)
题意 :其实题意我也说不清楚,因为比赛的时候我盯着看了1个小时也没看懂。。。。就是两个磁盘,第一个有n1的安装包,编号为1~n1,第二个有n2个安装包,编号为n1~n2。给你d对关系,(x,y)代表着安装x之前要先安装y。然后让你往里插入这两个磁盘,因为一次只能插一次,所以要满足他给的条件的时候要频繁的来回换。还有,要注意的一点是,无论先往里边插第一个还是第2个,第一次插的时候算一次,最后一次拔的时候算一次。
思路 :其实我真不知道这是拓扑排序,,,,,后来才知道的。。。。。
//#include <iostream>
//#include <string.h>
//#include <stdio.h>
//#include <algorithm>
//
//const int maxn = 424567 ;
//char sh[maxn] ;
//char ch[maxn] ;
//
//using namespace std;
//
//int main()
//{
// while(gets(sh))
// {
// int x = 0,j ;
// int len = strlen(sh) ;
// // printf("%d",len);
// for(int i = 0 ; i < len ; )
// {
// j = i + 1;
// if(sh[i] == sh[j])
// {
// while(sh[i] == sh[j])
// {
// j++ ;
// if(j - i >= 9)
// break ;
// }
// ch[x++] = j-i+'0' ;
// ch[x++] = sh[i] ;
// i += (j-i) ;
// }
// else
// {
// while((sh[j] != sh[j+1] && j+1 < len) || j == len-1)
// j++ ;
// ch[x++] = '1' ;
// for(int ii = i ; ii < j ; ii++)
// {
// ch[x++] = sh[ii] ;
// if(sh[ii] == '1' )
// ch[x++] = '1' ;
// //if(j == 0 && sh[j] != sh[j+1])
// //ch[x++] = '1' ;
// }
// ch[x++] = '1' ;
// i += (j-i) ;
// }
// }
// ch[x] = '\0' ;
// printf("%s\n",ch) ;
// }
// return 0;
//}
//
//#include <stdio.h>
//#include <string.h>
//#include <iostream>
//
//using namespace std ;
//int work(int m,int n)
//{
// int sum = 1;
// for(int i = 1 ; i <= n ; i++)
// sum *= 10 ;
// return m*sum ;
//}
//int main()
//{
// char ch[5] ;
// while(scanf("%s",ch) != EOF)
// {
// if(strcmp(ch,"00e0") == 0) break ;
// int s = (ch[0]-'0')*10+ch[1]-'0' ;
// int x = ch[3]-'0' ;
//
// int sum = work(s,x) ;
// int i = 1,num = 0 ;
// while(i <= sum)
// {
// i *= 2 ;
// num++ ;
// }
// printf("%d\n",2*(sum - i/2)+1) ;
// }
// return 0 ;
//}
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <queue> using namespace std ; const int maxn = ;
const int INF = ; int n,n1,n2,d;
int head[maxn],cnt,ans,deg[maxn],degr[maxn] ; struct node
{
int u,v,w ;
int next ;
} Edge[maxn] ;
queue<int>Q[] ; void addedge(int u,int v)
{
Edge[cnt].u = u ;
Edge[cnt].v = v ;
Edge[cnt].next = head[u] ;
head[u] = cnt++ ;
} void toposort(int u)
{
int sum = ;
for(int i = ; i <= n ; i++)
{
if(deg[i] == )
{
if(i <= n1) Q[].push(i) ;
else Q[].push(i) ;
}
}
int v,w ;
while(!Q[u].empty() || !Q[u^].empty())
{
while(!Q[u].empty())
{
v = Q[u].front() ;
Q[u].pop() ;
for(int i = head[v] ; i + ; i = Edge[i].next)
{
w = Edge[i].v ;
deg[w]-- ;
if(!deg[w])
{
if(w <= n1) Q[].push(w) ;
else Q[].push(w) ;
}
}
}
u = u^ ;
sum++ ;
}
if(sum < ans) ans = sum ;
} void Init()
{
n = n1+n2 ;
memset(head,-,sizeof(head)) ;
memset(degr,,sizeof(degr)) ;
cnt = ;
ans = INF ;
}
int main()
{
while(~scanf("%d %d %d",&n1,&n2,&d))
{
if(n1 == && n2 == && d == ) break ;
Init() ;
int x,y ;
for(int i = ; i <= d ; i++)
{
scanf("%d %d",&x,&y) ;
degr[x]++ ;
addedge(y,x) ;
}
for(int i = ; i <= n ; i++)
deg[i] = degr[i] ;
toposort() ;
for(int i = ; i <= n ; i++)
deg[i] = degr[i] ;
toposort() ;
printf("%d\n",ans+) ;
}
return ;
}
POJ 1778 All Discs Considered(拓扑排序)的更多相关文章
- All Discs Considered(拓扑排序)
http://poj.org/problem?id=1778 题意:有两个DVD,第一个DVD上有编号为1~n1的安装包,第二个DVD上有编号为n1+1~n1+n2的安装包,给出m组关系(a,b) 表 ...
- POJ 3249 Test for Job (拓扑排序+DP)
POJ 3249 Test for Job (拓扑排序+DP) <题目链接> 题目大意: 给定一个有向图(图不一定连通),每个点都有点权(可能为负),让你求出从源点走向汇点的路径上的最大点 ...
- poj 3687 Labeling Balls - 贪心 - 拓扑排序
Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N ...
- POJ 3687 Labeling Balls【拓扑排序 优先队列】
题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...
- poj 2367 Genealogical tree (拓扑排序)
火星人的血缘关系很奇怪,一个人可以有很多父亲,当然一个人也可以有很多孩子.有些时候分不清辈分会产生一些尴尬.所以写个程序来让n个人排序,长辈排在晚辈前面. 输入:N 代表n个人 1~n 接下来n行 第 ...
- poj 3683 2-sat建图+拓扑排序输出结果
发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...
- poj 2762 强连通缩点+拓扑排序
这题搞了好久,先是拓扑排序这里没想到,一开始自己傻乎乎的跑去找每层出度为1的点,然后才想到能用拓扑排序来弄. 拓扑排序的时候也弄了挺久的,拓扑排序用的也不多. 题意:给一个图求是否从对于任意两个点能从 ...
- POJ 1270 Following Orders(拓扑排序)
题意: 给两行字符串,第一行为一组变量,第二行时一组约束(每个约束包含两个变量,x y 表示 x <y).输出满足约束的所有字符串序列. 思路:拓扑排序 + 深度优先搜索(DFS算法) 课本代码 ...
- 【POJ 2585】Window Pains 拓扑排序
Description . . . and so on . . . Unfortunately, Boudreaux's computer is very unreliable and crashes ...
随机推荐
- APUE(1)——UNIX基本概念
1.OS——操作系统是管理硬件资源的软件,也称作内核.与此同时,操作系统还为其他程序提供一系列的服务,比如执行程序.打开文件.读文件等等. 2.Kernel——内核对外提供一系列的系统调用,而一些库又 ...
- 处理 eclipse 导入报错 Invalid project description,问题
有时候在添加工程时,会出现如图所示的错误信息, ,提示显示将要添加的工程已经存在,但是在工作空间里却找不到,这个时候,要做就是, 在导入的时候选择General->Existing Projec ...
- sublime中使用markdown
#为知笔记##为知笔记###为知笔记 1. 列表12. 列表23. 列表35. 顺序错了不用担心3. 写错的列表,会自动纠正 为知笔记---------------------- ```cpp int ...
- SQLServer2012分离出的数据库存放路径
分离出的数据库没有保存位置提示,经常会导致分离出的数据库找不到 以下是分离出的数据库默认位置: C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL ...
- pb popmenu弹出式选单位置的问题
在主界面上使用m_main.m_title.PopMenu(PointX(),PointY()),可以正确定位弹出式选单的位置: 在主界面的控件智商为使用m_main.m_title.PopMenu( ...
- iOS iOS与html进行交互
实现的 效果就是上边那样:首先通过webview 进行网络请求 然后进行显示. 然后点击下一页的按钮 通过js的响应显示另一个网页 最后通过下一页的按钮可以返回到首页. 本文仅仅是h5跟ios 的交互 ...
- OS X环境下SVN回滚工程到指定版本,回滚指定文件到指定版本
1.打开命令行终端 2.cd + 工程或文件目录 3.svn update 工程目录或文件目录 -r 版本号 在Xcode中选中文件,右键选择''show in finder''(也可以用快捷键,不过 ...
- 获取键盘输入或者USB扫描枪数据
/// <summary> /// 获取键盘输入或者USB扫描枪数据 可以是没有焦点 应为使用的是全局钩子 /// USB扫描枪 是模拟键盘按下 /// 这里主要处理扫描枪的值,手动输入的 ...
- ios专题 - 委托模式实现
在ios中,委托模式非常常见,那委托模式是什么? 委托模式是把一个对象把请求给另一个对象处理. 下面见例子: #import <UIKit/UIKit.h> @protocol LQIPe ...
- ES6的编码风格
编程风格 [转自http://es6.ruanyifeng.com/#docs/style] 块级作用域 字符串 解构赋值 对象 数组 函数 Map结构 Class 模块 ESLint的使用 本章探讨 ...