摘要:
这题主要是字符读入的问题吧,对于NAME的读入,一直getchar()到',',对于后面的五个属性from,to,length,people number,light只读数字就可以了,而且他们的处理相同,可以用一个函数来实现下面是代码:1. #include<iostream>2. #include<cstdio>3. #include<cstring>4. #include<queue>5. #include<algorithm>6. using namespace std;7. struct Edge{8. lon 阅读全文
摘要:
在现场的时候想出了算法,可惜一直tle,结束后才想到是被重边给卡了。。。。。。我想到的算法思路如下:对于一个单图,一个点的相邻点中度数比它大的点的数目不会超过(2m)^(1/2)个,所以对每个点分别纪录两种颜色的比它度数小的邻点到它的边权总和,再维护所有边中颜色为00,11,01/10的边权总和。这样遇到查询操作则直接输出结果,遇到改色操作则先用此点纪录的度数比它小的邻点信息修改总值,再逐边维护度数比它大的邻点的纪录值和总值,此项的时间复杂度是O(m^1/2)。总时间复杂度是O(q*m^1/2);由于m<=100000,q<=100000,所以此算法可过。现场太悲剧了,完全没注意到 阅读全文
摘要:
本题大意:有一条点,第i点与第i+1点之间有路i,第k次走过路i获得的愉悦值是ai-(k-1)*bi,保证愉悦值为正,求如何走可以使得愉悦值最大分析:考虑起点i和重点j,可以假设i<=j,那么i左边的路必定走过偶数次,j右边的路必定走过偶数次,i与j之间的路必定走过奇数次,然后DP即可。#include<stdio.h>#include<iostream>#include<string.h>using namespace std;const int oo=100000000;int f[200][200][200],g[200][200],h[200] 阅读全文
摘要:
有n个石子连成一排,先要把这些石子拿光,刚开始可以任取一个,接下去只能取“有相邻的石子被取走”的石子,例如刚开始有5个石子,刚开始取走第3个,第二步只能取第2或第4个,以此类推。给出n,问将石子取光的方法有多少种。两种取法只要有某次取的石子不一样就视为不同。假设第一次取的第k个,那么左边剩(k-1)个,右边剩(n-k)个。然后要取(n-1)次,其中有(k-1)次要取左边,故有组合数Binomial[n-1,k-1]种取法。总的取法是Sum[Binomial[n-1,k-1],{k,1,n}]=Sum[Binomial[n-1,k],{k,0,n-1}]=Power[2,n-1]。 阅读全文
摘要:
题目大意为给定一张有向图,求加多少条边之后整个图是一张强连通分量。思路大致是:先将图中的强连通分量缩点,使得图变成一张无环图,这个时候图上剩余k1个出度为0的点和k2个入度为0的点,将出度为0的点连一条有向边到入度为0的点,此时形成一个环,这个环是一个强连通分量,可以再缩成一个点,当图中只剩一个点的时候,就完成了任务。显而易见的是最大只要连接max{k1,k2}条边,就能将所有的点缩成一个点。#include<stdio.h>typedef struct edge { int x; edge *n; ... 阅读全文
摘要:
题目可以转化为在一个两边点数相等的完全二分图上找出权值总和最小的匹配。添加一个源点和一个汇点,汇点到每个人连一条容量为1,费用为0的边;每个房子到汇点连一条容量为1,费用为0的边;每个人到所有房子分别连一条容量为1,费用为人到房子距离的边。再在此图上做一次最小费用最大流即可。View Code #include <stdio.h>#include <stdlib.h>long b[10000],a[202][202][2];int main (){ long pre[202],w[202],min[202],dh[202][2],dm[202][2],nh,nm,i,j 阅读全文
摘要:
1.拆点(把一个点拆成2个,边流量为警(和谐)察数,然后每条边连的时候用其中一个点的第二个点去连另一个点的第一个点,边流量为无穷大,其他边都为0,再注意下源点和汇点就可以了)2.最大流找最小割View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX 100000000 4 int n,m,s,h,c[205][205],p[205]; 5 int find() 6 { 7 int x,i,inque[205],que[205],head=0,tail=0; 8 memset(inque,0,size 阅读全文
摘要:
View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 struct data{ 4 int st,fi,v; 5 }a[25010]; 6 int i,j,res,ans,file,t,w1,w,father1,father2,father[510],n,m,k,flag; 7 void qsort1(int l,int r) 8 { 9 int i=l,j=r,t=a[(l+r)/2].v;10 struct data change;11 do{12 while (a[i].v<t) i++... 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=2444题意:一堆学生中存在一些互相认识的pair,问能否将这些学生分成两部分,使得每部分中的学生互相都不认识。先判断是否为二分图,对每对点标记两种颜色。如果出现染色矛盾情况则说明不是二分图,此时需要继续读完输入数据。是二分图后用最大流完成二分图的最大匹配。View Code #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define N 205 #define M 阅读全文
摘要:
此题是非常典型的表达式求值问题,既然只有最多15个变量,那就枚举每一种变量的取值代入计算,如果全部相等则认为两个表达式相等。View Code 1 #include <stdio.h> 2 3 char ve[500][50]; 4 long x[500],vnum,pfs,pf; 5 6 int tran(char c){ 7 8 if (c==')') 9 return 0; 10 11 if (c=='^') 12 return 1; 13 14 if (c=='|') 15 ... 阅读全文