Day1:T1 模拟 T2 拓扑排序
T1:模拟
自己第一天的简直跟白痴一样啊...模拟都会打错..
当时貌似在更新最大值的时候打逗比了...
if((sum[x]==max && x<maxh) || sum[x]>max){
  max=sum[x];
  maxh=x;
//现在(也就是9月+)再看,脑袋里只有sortsortsort,连最基本的更新最大指都忘了....智商唉....
附上代码:
#include<cstdio>
#include<cstring>
using namespace std;
int f[9]={10,8,6,5,4,3,2,1};
int n,m,x,max=0,maxh=10000100;
long long sum[1000001];
bool cmp(int a,int b){
return a>b;
}
int main(){
freopen("rank.in","r",stdin);
freopen("rank.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
for(int j=0;j<8;j++){
scanf("%d",&x);
sum[x]+=f[j];
if((sum[x]==max && x<maxh) || sum[x]>max){
max=sum[x];
maxh=x;
}
}
printf("%d\n",maxh);
}
return 0;
}
T2:拓扑排序
这是我在长乐学的第一个学到的东西...蒟蒻表示看懂了这个算法很开森..
当时由于我是一个记性特不好的人,越发的意识到写写题解的重要性!
首先先介绍一下拓扑排序吧
如果一个点y之前有另一个点x指向它,那么出渡c[x]++;入渡r[y]++;
c[]就表示x的出渡,也就是记录他指向多少个点;
r[]就表示y的入渡,也就是记录有多少点指向它;
这里还需要一个二维数组a[][]
让a[x][c[x]]=y;
也就是用来记录以x为起点,它所连的第c[x]个点是y;
理解了数组的含义,接下来模拟一下即可:
稍微讲一下思路吧:
1.选择一个入度为0的点存入ans[]里,输入;但是这里要注意若一开始就有多个点的入度为0,最后一个搜的点先输出。
2.删除和这个点有关联的边
3.ans里的指针tot--,如果存在入度为0的点,tot++;输出当前搜到的点,不然就输出之前存的;
4.while(num<n);
复杂度O(V+E);
模板代码:
for(int i=1;i<=m;i++){//m为关系的次数
    scanf("%d%d",&x,&y);
    c[x]++;
    a[x][c[x]]=y;
    r[y]++;
}
for(int i=1;i<=n;i++){//n为总的个数
    if(r[i]==0) ans[++tot]=i;
}
while(num<n){
    temp=ans[tot];
    printf("%d",temp);//这里注意是从入渡为0的最后一个点先输出的
    tot--;
    num++;
    for(int j=1;j<=c[temp];j++){
         r[a[temp][j]]--;
    }
    for(int j=1;j<=n;j++){
         if(r[a[temp][j]]==0){
              tot++;
              ans[tot]=j;
              break;
         }
    }
}
当然这一道题吧,除了用拓扑之外,还需要注意判断是否满足条件
这里判断的方法是
1.如果不存在入渡为0的点,也就是存在一个环的时候,不满足条件
2.在拓扑过程中,找不到入度为0的点,也不满足;
PS:这里还需要注意一个题目中的小细节,也就是在入渡都为0的情况下,先输出号数比较小的;
//找到了就直接break这样可以保证找到的是最小的编号
附上ccy大神的注释:
//拓扑排序 给出注释
program event;
var
f:array[0..1001,0..1001] of boolean;
a:array[0..100000] of longint;
b:array[0..1001] of longint;
n,m,x,y,t,i,j,top:longint;
begin
fillchar(f,sizeof(f),false);
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
readln(n,m);
for i:=1 to m do
begin
readln(x,y);
if not f[x,y] then//如果读入的关系没有重复
begin
f[x,y]:=true;//置为已用过
inc(a[y]);//对应的较晚发生的历史事件的入度递增
end;
end;
for i:=1 to n do
begin
t:=0;//用来判断是否有找到一个入度为0的节点
for j:=1 to n do
if a[j]=0 then
begin
t:=j;//如果找到了就直接break这样可以保证找到的是最小的编号
break;
end;
for j:=1 to n do
if f[t,j] then//如果这个点的出度对应的也存在
begin
dec(a[j]);//其出度递减
f[t,j]:=false;//这条线去除
end;
inc(top);//递增栈
b[top]:=t;//入栈
a[t]:=-1;//该节点的入度变成1
if t=0 then//如果t=0就代表没有将任何节点都找到 就直接输出错误信息退出
begin
writeln('Error!');
halt;
end;
end;
for i:=1 to top do writeln(b[i]);//从早到晚打印每一个历史事件
end.
这里没有按照书本上的模板打,但是思路相同,貌似ccy的打法会更简单直观一点...学习了
自己就不再重打一遍了
//这也给我一种很深的感悟吧。学习一种算法,牢记思想其实就足够了。
看模板代码有好有坏吧,好的一面是可以很清楚的知道它实际调用的过程,坏的一面是模板代码写多了很容易形成一种思维定势。。要懂得灵活变通才是王道
Day1:T1 模拟 T2 拓扑排序的更多相关文章
- UVA - 12263 Rankings  模拟(拓扑排序)
		
题意:1~n这n个数,给你一个初始的顺序,再告诉你那两个数的大小关系发生了变化,求变化后的 顺序,不存在则输出IMPOSSIBLE 思路:这题很遗憾没在比赛的时候过掉,结束后加了一行就AC了.题目真的 ...
 - Codeforces Round #285 (Div. 2) A B C 模拟 stl  拓扑排序
		
A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
 - UVA215-Spreadsheet Calculator(模拟+拓扑排序)
		
Problem UVA215-Spreadsheet Calculator Accept:401 Submit:2013 Time Limit: 3000 mSec Problem Descript ...
 - [ACM_模拟] POJ 1094  Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)
		
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
 - 【noip模拟赛4】找啊找啊找BF  拓扑排序
		
描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...
 - NOIP2017 Day1 T3 逛公园(最短路+拓扑排序+DP)
		
神tm比赛时多清个零就有60了T T 首先跑出1起点和n起点的最短路,因为k只有50,所以可以DP.设f[i][j]表示比最短路多走i的长度,到j的方案数. 我们发现如果在最短路上的和零边会有后向性, ...
 - POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)
		
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28399 Accepted: 9684 De ...
 - [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)
		
题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...
 - [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)
		
Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...
 
随机推荐
- ZOJ 1649:Rescue(BFS)
			
Rescue Time Limit: 2 Seconds Memory Limit: 65536 KB Angel was caught by the MOLIGPY! He was put ...
 - Use PRODUCT_USER_PROFILE To Limit User
			
The PRODUCT_USER_PROFILE (PUP) table provides product-level security that supplements the user-level ...
 - hdu  2191  (多重背包+二进制优化)
			
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
 - Objective-C马路成魔【12-分类和协议】
			
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...
 - C#-简单的定时器(C# ConsoleApp) ---ShinePans
			
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpbmVwYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
 - Linux报too many open files的解决方案
			
今天系统中有一台服务器出现异常,有时连简单的shell命令都无法执行,各种奇怪的报错,有的时候又可以成功执行 如: -bash: error while loading shared librarie ...
 - 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
			
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
 - WebBrowser控件使用详解
			
原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...
 - AngularJS模块的详解
			
AngularJS模块的详解 在讲angularjs的模块之前,我们先介绍一下angular的一些知识点: AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规 ...
 - php soap调用asp.net webservice
			
原文:php soap调用asp.net webservice 首先做一下准备工作,找到安装环境里的php.ini把;extension=php_soap.dll去掉前面的;.我这里使用的是wamp, ...