摘要: 题意:给定一个n节点m条边的无向图,定义c为每对顶点的最短路之和,要求删掉一条边重新求一个c值c',求出c'最大值.解法:dijkstra+堆优化,最短路径树. 首先可以通过dijkstra求出单源最短路,对于删边的操作,如果我们枚举每条边的时候都求一次最短路肯定是超时的. 对于一个源点确定的最短路径树,如果我们删掉的边不在这个最短路径树上,那么就不需要重新计算最短路. 根据这个性质,我们只需要记录下每个源点构成的最短路径树上都有哪条边,然后在枚举边的时候判断是否需要重新计算最短路 1 #include<cstdio> 2 #include<queue> 阅读全文
posted @ 2012-11-28 11:23 silver__bullet 阅读(497) 评论(0) 推荐(0) 编辑
摘要: ... 阅读全文
posted @ 2012-11-28 10:37 silver__bullet 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 先挖个坑....这几天没时间填..... 阅读全文
posted @ 2012-11-28 10:36 silver__bullet 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 题意:...解法:求最大流并给出一种流量分配方案. 建图过程,每个机器有入口和出口,所以要拆点. 如果不拆点的话,下面的样例可以cha掉这个解法 2 4 10 0 0 0 1 10 0 0 0 0 10 0 1 1 1 10 0 1 1 1 至于输出一种可行方案,我们可以想一下dinic算法的执行流程,每次增广的过程都发生在dfs的时候,所以在回退增广的时候我们可以记录下这条边是否被增广... 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm 阅读全文
posted @ 2012-11-24 16:42 silver__bullet 阅读(149) 评论(0) 推荐(0) 编辑
摘要: A.解法:序列n,n-1,n-2...1就是不满足条件的,因为n-1被换到第一个之后就不会再改变位置了...B.解法:如果这些数的总和能被n整除,那么经过多次操作肯定会让所有的数全变成sum/n,如果不能整除的话,那么就舍弃其中一个数,让其他的数都变成相同的某个值....C.题意:给定n个不同的数,需要从中选出k组,其中每组的和都不一样... 解法:暴力构造就行了,别的没什么了...不过比赛的时候我还是sb了...C 1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #includ 阅读全文
posted @ 2012-11-22 12:44 silver__bullet 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题意:....解法:很容易发现这是个匹配问题,如果直接建图的话,点的数量会达到10^5..需要进行压缩,我们发现m最大只有10个,那么表示人数的那些点可以按照和星球相连的情况进行压缩....压缩之后建图求最大流即可... 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define N 1500 6 using namespace std; 7 const int inf=(1<<30); 8 struct Edg 阅读全文
posted @ 2012-11-21 23:11 silver__bullet 阅读(220) 评论(0) 推荐(0) 编辑
摘要: A....B...C.从后向前进行贪心,因为后一半的硬币只能是在取前一半的时候被拿掉,而对于前一半,不能确定到底是由哪种方式拿掉的... 如果n是偶数,那么拿掉n时,(n/2)*2+1也应该被拿掉,而实际上没有n+1这一堆,所以肯定不行.C 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define N 1010 6 using namespace std; 7 int s[N]; 8 int main(){ 9 int n 阅读全文
posted @ 2012-11-21 21:41 silver__bullet 阅读(102) 评论(0) 推荐(0) 编辑
摘要: A...随意搞B.题意:从1~n(n<=1e9)中统计最多由两种不同数字组成的数的个数. 解法:枚举两个数字,然后考虑每一位的情况,用二进制的思想..最后统计结果B 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 using namespace std; 6 typedef long long ll; 7 int dig(ll n){ 8 int ans=0; 9 while(n>0){10 n/=10;11 ans++; 阅读全文
posted @ 2012-11-19 23:14 silver__bullet 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 题意:混合图求欧拉回路。解法:对于欧拉图,所有顶点入度和出度之差均为偶数。 建图思路:1.首先为无向边随意定一个方向,统计每个点入度出度; 2.另设源点汇点,对于出度>入度的点,与源点连边,正向边容量为(out-in)/2,对于入度>出度的点,与汇点连边,正向边容量为(in-out)/2; 3.对于除了源点汇点之外的点,有向边舍弃,无向边按照先前指定的方向建边,容量为1. 整个图建好之后,流经每个顶点的容量可以理解成把这个点的入(出)边变成出(入)边的数量。。。 如果是满流就表示所有的点最后都能使得入度==出度。。 1 #include<iostream> 2... 阅读全文
posted @ 2012-11-15 23:57 silver__bullet 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 吐槽:比赛刚开始codeblocks出了点问题。。边看题边弄编译器。。。囧。。 D居然一直没看。。因为E题意好懂。。然后sb地卡了一场E。。。战斗力太不稳定。。。A...A 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define N 100010 5 using namespace std; 6 int ans[N][2]; 7 int main(){ 8 int x,y,a,b; 9 while(cin>>x>>y>>a>>b 阅读全文
posted @ 2012-11-12 13:54 silver__bullet 阅读(1111) 评论(2) 推荐(0) 编辑