444. 爱好和平

时间限制 1000 ms 内存限制 65536 KB

题目描述

在星际时代,每个帝国都靠着贸易路线连接着各个联盟星球,这些贸易路线都是双向可达的。一个帝国的综合实力由他贸易连接着的联盟星球数决定。
学姐作为Mays帝国的领袖,长期与Luke帝国保持着敌对关系,爱好和平的学姐希望结束长达几个世纪的战争,于是找实验室定做了一颗代号小苹果的炸弹,可以定点摧毁一颗星球,这颗星球被毁后,与它相连的全部贸易就都被切断了,这样Luke帝国可能就被切断为一个小联盟,他们就再也不会对学姐的地位构成威胁啦~
经过调查,Luke帝国为了节约经费,他的联盟星之间都有且仅有一条直接或间接的贸易通路。
现在给出Luke帝国的贸易线路,学姐想知道摧毁哪一颗行星可以使得分裂后的若干Luke联盟威胁最大的分部最小。

输入格式

输入有多组数据,组数不大于10组。每一组开头一行为n,m,表示Luke帝国的联盟星球数量,和贸易关系数,接下来m行,每行两个整数u,v,表示星球u,v之间存在直接的贸易路线,1<=u,v<=n,1<=n,m<=100000

输出格式

输出一个数表示推荐学姐摧毁的星球,如果有多解,输出编号最小的一个。

输入样例

5 4
1 2
1 3
1 4
4 5

输出样例

1  
首先是分析题意,根据题意可知目标是求每个节点所连接的(两个子节点和的最大数量)与(其父亲节点所连的另一边的节点数)的最大值dp[u],每个节点都得到这样的一个dp[u]值,然后遍历比较找到所有点的max值的最小值,然后选取该点。
包括知识点:用数组模拟邻接表+dfs
<span style="font-size:14px;">#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=100005;
const int maxe=200010;
int head[maxn];
int n,m;
int u,v;
int dp[maxn];
int num[maxn];
int cnt=1;
struct
{int to,next;
}e[maxe];
void init()
{for(int i=0;i<=n;i++){head[i]=0;dp[i]=0;num[i]=0;}
}void add(int u,int v){e[cnt].to=v;//第cnt条边;e[cnt].next=head[u];//head数组的相当于下标的作用;而数组的下标u表示以u为起点;head[u]=cnt++;}
int dfs(int u,int fa)//搜索是从u点出发的,若u连有x条边就dfs一次
{num[u]=1;for(int i=head[u];i!=0;i=e[i].next)//注意循环条件,head的值是cnt赋给的所以head也是相当于技术,若其等于0,表示最初的状态,即以该点为起始点的边已经遍历完毕;{int v=e[i].to;if(v==fa) continue;<span style="font-family: Arial, Helvetica, sans-serif;">//直到找到指向fa为止;</span>else num[u]+=dfs(v,u);//若没有找到fa则再往下继续搜索,每一次dfs都是搜一个点的所有儿子,所以dfs一次的返回值是儿子数目。}dp[u]=n-num[u];//除了他和所有儿子以外剩的;for(int i=head[u];i!=0;i=e[i].next)//再遍历一遍;{int v=e[i].to;if(v==fa) continue;else dp[u]=max(num[v],dp[u]);}return num[u];
}int main()
{while (scanf("%d%d",&n,&m)==2){init();cnt=1;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);add(u,v);add(v,u);}dfs(1,0);int ans=10000000;for(int i=1;i<=n;i++)ans=min(ans,dp[i]);for(int i=1;i<=n;i++){if(ans==dp[i]){printf("%d\n",i);break;}}}return 0;
}</span>


网上看来的,讲的挺好,其实后来发现这个其实数组的名字就是指针的概念,例如: next[i]=first[ u [ i ] ]就是i->next=u[i]->first.
  1. int main()
  2. {
  3. int i,j,n,m,t,c;
  4. int first[MAXN];
  5. int u[MAXN],v[MAXN],w[MAXN],next[MAXN];
  6. scanf("%d%d",&n,&m);
  7. for(i=0;i<=n;i++) first[i]=-1;
  8. for(i=0;i<m;i++)
  9. {
  10. scanf("%d%d",&u[i],&v[i]);//u是弧尾,v弧头
  11. next[i]=first[u[i]];//就这万恶的两行
  12. first[u[i]]=i;//短小精悍!
  13. }
  14. //后面为自己理解后添加的。
  15. for(i=1;i<=n;i++)
  16. {
  17. if(first[i]==-1)
  18. {
  19. printf("没有以点<%d>为起点的邻接表。\n",i);
  20. continue;
  21. }
  22. printf("以点<%d>为起点的邻接表:\n",i);
  23. for(j=first[i];j!=-1;j=next[j])
  24. {
  25. printf("<%d  %d>    ",i,v[j]);
  26. }
  27. printf("\n\n");
  28. }
  29. return 0;
  30. }
这个可以用来读入有向图(最好是稀疏)的边列表,然后建立邻接表。next[i]=first[ u [ i ] ] 表示第i条边的下一条边是first[ u [ i ] ];

first[ u [ i ] ]=i   就是把节点u[i] 的链表头指向第i条边。

2014新生暑假个人排位赛06 -444. 爱好和平 (数组模拟邻接表+dfs)相关推荐

  1. 【总结】2014新生暑假个人排位赛02

    A. 丁神去谷歌 2014新生暑假个人排位赛02 时间限制 1000 ms 内存限制 65536 KB 题目描写叙述 丁神要去Google上班了,去之前丁神想再做一道水题,但时间不多了,所以他希望题目 ...

  2. 2014新生暑假个人排位赛01 B. 学姐去学车

    B. 学姐去学车 时间限制 1000 ms内存限制 65536 KB 题目描述 趁着放假,学姐去学车好带学弟去兜风.但是学车真的很辛苦,每天五点半就要起床赶班车,但是学姐的教练更辛苦,他们要相同的时间 ...

  3. 2014新生暑假个人排位赛02 E. 木头人足球赛

    E. 木头人足球赛 时间限制 1000 ms 内存限制 65536 KB 题目描述 木头人星的行动速度是地球上乌龟的 1/10 (所以可以忽略移动的速度),可是他们也热爱运动,尤其是足球. 他们的足球 ...

  4. 云南计算机专业知识真题,2014年云南省事业单位考试专计算机专业知识模拟真题.doc...

    2014年云南省事业单位考试专计算机专业知识模拟真题 1 在Word中替换的快捷键是____. A.CTRL+F B.CTRL+H C.CTRL+S D.CTRL+P 2 在Word中打印的快捷键是_ ...

  5. (06)System Verilog 数组类型示例

    (06)System Verilog 数组类型示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 数组类型示例 5)结语 1.2 F ...

  6. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

  7. 2014年暑假学习笔记

    2014-7-3 System.getProperty("user.dir") 用户的当前工作目录 QPS每秒查询率(Query Per Second) 每秒查询率QPS是对一个特 ...

  8. 【weJudge】1106. [ACM][2014新生赛重现][现场]Gundam Unicorn

    你上有一门威力巨大的光束炮,然而它现在剩下的能量只能再发射一次.为了使敌人受到更大的损失,你必须谨慎地使用这仅剩的一次机会. 敌军队形和光束炮的覆盖范围均为矩形(矩形不可旋转). 输入要求 输入数据有 ...

  9. 【weJudge】1107. [ACM][2014新生赛重现][现场]啊~啊~,麻婆豆~腐,麻婆豆~腐~

    麻婆豆腐是小奏最爱的食物,为了做出最上等的麻婆豆腐,小奏准备了若干上等的食材,并且获得了传说中的麻婆豆腐的料理方法:每次将两种食材合二为一,成为一种新的食材,直到所有的食材都合并到一起,传说中的麻婆豆 ...

  10. 2014年暑假——英语清凉了夏季的炎热

    --题记 又是度过了这个城市中一年最热的季节,又是枯燥中夹杂着美丽的学英语的声音.暑假就这么仓促的过去了,是啊,当所有人在感慨时间飞快的时候,有这样一种人是在每天坚持着做一件事的,这样的人都是好样的. ...

最新文章

  1. 算法笔记——整数划分1
  2. 在SAP HANA Express Edition里创建数据库表
  3. c#重写了窗体的OnKeyDown事件,但是不执行
  4. 手把手教你如何加入到github的开源世界!
  5. ora-28547 可能是oracle net 管理错误_PostgreSQL与Oracle:成本、易用性和功能上的差异...
  6. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_1_两种获取Stream流的方式...
  7. Conda 下 安装 Allennlp
  8. 即席查询(Ad Hoc)入门(Kylin)
  9. android 国际化之Locale
  10. Python实现遗传算法求函数最值
  11. 学习笔记25马氏链模型
  12. CISA Exam Prep: Certified Information Systems Auditor
  13. 卧推动作发力技巧分析
  14. jQuery的click点击方法合集
  15. 初学者vs安装_如何为初学者安装和设置WP Super Cache
  16. 学习记录四 运行skynet基础例子
  17. easypoi 模板导入、导出合并excel单元格功能
  18. 题目3:文本文件单词的检索与计数(代码实现)
  19. mfc获取计算机名和用户名
  20. redis分区(分片)原理

热门文章

  1. 保健品消费者需求调研内容及设计
  2. 情人节神奇的传情之物,“懂爱”的你都会爱上它丨情人节系列
  3. 全面拆解携程云原生实践,打造智能弹性的云端酒店直连系统!
  4. 详解Linux内核红黑树算法的实现 http://blog.csdn.net/npy_lp/article/details/7420689
  5. 【GDOI2017】【gmoj5101】【7.15模拟赛T4】凡喵识图【暴力】
  6. 磕碰,擦伤了,紧急处理方法
  7. [总结] 上海看房体验有感
  8. php计算macd,php交易者macd返回false
  9. 【读书笔记】《可复制的领导力》——人人都能学会领导力
  10. 最优化算法---可行方向之Frank-wolfe 方法(求解非线性规划问题)