随笔分类 - 图
摘要:Dijkstra最短路模拟每个key的坠落时间,发现就是Dijkstra。求出每个key的时间求其最大值,再求每条边整个坠落的时间,求其最大值,得二者最大值即结果。其中每条边的坠落事件为tv+(cost-(tv-tu))/2,其中u,v为边的两个key节点,tv>tu,cost为边的权值 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=500+10; 7 const int inf=0x3f3f3f3f; 8 const int maxm=maxn*maxn; 9 s.
阅读全文
摘要:二着色+DP在不是互相认识的节点之间连一条边,最后得到由多个连通分量构成的图。把图中节点分为两组,保证图中每条边的两个顶点不能再同一组。对每个连通分量进行二着色,每个连通分量的点就分为了a,b两组。假定最后整个图分为1,2两组。每个连通分量的a,b两组,无非一个在1组一个在2组,通过DP,确定每个连通分量中a,b哪个在1组,哪个在2组时最有。然后就是DP的过程,没想出来,看了其他人的结题报告。f[i][j]表示对于前i个联通分量,是否可达到第1组和第2组的差值为j的状态。设a为连通分量i的两组的差值则f[i][j]=1当f[i-1][j-a]==1||f[i-1][j+a]==1。 1 #i.
阅读全文
摘要:二分图匹配+floyd求图中节点是否可达。模型很容易想到。此题我认为用网络流最好解释,如果有device有重复的话。二分图建模比较麻烦。一开始没想到这点,用二分图做的,但是AC了,数据应该没有device重复的情况。然后就是判断一个插头通过适配器能转化成什么其他的插头,刚开始用矩阵乘法来判断这个关系,数据一开到500运行时就运行错误(感觉也不是很大啊,至今还不知道原因),后来在网上发现有用floyd做,想了想,确实可以,而且还简单,就是个DP的过程。 1 #include 2 #include 3 #include 4 #include 5 #i...
阅读全文
摘要:拓扑排序,做的时候wa了n次,后来找来数据,又想了想,发现了自己的错误,就是当拓扑排序的时候出现了不确定的情况,还要在拓扑下去,因为可能还会有矛盾的情况出现,保证没矛盾的情况下才可以说是不确定的情况 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 const int maxn=30; 7 int e[maxn*maxn],head[maxn],next[maxn*maxn],in[m
阅读全文
摘要:最短路的应用,只不过路径的权值从单一的长度变成了各种耗费时间的和#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn=300+10;
const int maxm=(50000+10)*2;
const int inf=200000000;
int head[maxn],dis[maxn],vis[maxn],pre[maxn],re[maxn],ans[maxn];
int e[maxm],nextv[maxm],cost[
阅读全文
摘要:数据量不大,可以直接枚举。首先确定所需要的最小进制,然后从此处向62进行枚举。然后就是关于求摸的问题。不可能把整个数先求出来。因为数很大,根本存不下。根据求摸公式可得结果a1a2a3a4...a(s)%(n-1)=(a1+a2+...a(s)))%(n-1)#include <iostream>
#include <cstring>
using namespace std;
char s[40000];
int get(char a)
{ if(a>='0'&&a<='9') return a-'0
阅读全文
摘要:在网上看的解题报告,推到了一会,终于想明白了这个过程,先写出c关于b的关系式,通过枚举b看是否符合c是整数的条件,然后确定界的问题,根据式子首先可确定b>a,因为b和c在关系式中具有对称性,那么可让b永远都<=c(b和c的关系就三种),通过b-c<=0确定上界,然后通过f=c+b求导可知,在枚举b的范围内f是递减的,所以从大到小枚举得到的第一个满足的,f就是最小,注意a*a比较大,要用unsigned long来定义a#include <iostream>
#include <cmath>
using namespace std;
int main()
阅读全文
摘要:刚开始是用的邻接矩阵,一直wa,后来看了其他人的代码,又想了想,两个点之间有多条路径,不能只存储权值最小的,因为每个路径都可能是一个最短路的组成部分(但现在还不是想的太清楚),所以有多少条边,就存多少边的信息bellman-ford#include <iostream>
using namespace std;
const int maxn=501;
const int inf=2<<20;
int d[maxn],w[maxn*maxn],u[maxn*maxn],v[maxn*maxn];
int f,n,m,wm,t; bool bellman()
{ int i
阅读全文
摘要:bellman-ford算法,此题可看做最短路径问题,原因是,可把到源点的距离看做负值(自己建立的一个抽象模型,但不表示出来,考虑的时候按这个负值模型考虑)。那么求解此题,就是看有没有至少一个负权环,如果有的话,因为根据此题可知,所以包含这个负权环的任一路径且在这个负权环之后的所有节点都会是无穷小,源点到源点的某一路径一定包含这个负权环,所以只要这个负权环走过一定次数,一定会导致源点到源点的距离小于初始值,其实就是题目要求的大于初始值。不需要考虑正权环抵消对结果的影响,因为如果有正权环,完全可以不走这个正权环。因为从源点返回源点,至少会经过一个环,但如果没有负权环,就不会使得到的新距离小于初始
阅读全文
摘要:最短路径问题,我用的是临接表来存储各个边的信息,用优先队列的dijkstra算法#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int maxn=101;
const int INF=2<<20;
struct edge { int po,w; edge * next;
};
struct node
{ edge * first;
}head[maxn];
typedef pair<int,int>pii;
priori
阅读全文
摘要:刚开始没有理解题意,以为是最短路径,后来才发现是prim,哎,无语。。。#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=201;
const double INF=2<<20;
double x[maxn],y[maxn],edge[maxn][maxn];
int n;
double getd(int k,int j)
{ double ex=(x[k]-x[j])*(x[k]-x[j]); double ey=
阅读全文
摘要:单源最短路径,此题主要是要理解题目的意思。根据“他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。”这句话可知,一定要在一符合要求的区间(这个区间的上限和下限要符合等级限制,并且要包括编号1)里找,然后把所有符合要求的区间的值进行比较,从而得到在限制条件下的最短路径#include <iostream>
using namespace std;
#define maxn 201
#define INF 2<<20
int edge[maxn][maxn];
int inlim[maxn],lev[maxn],val[
阅读全文
摘要:最小生成树的基本知识,此图很稠密,所以选用Prim算法要快,Prim O(n2),Kruckal O(elog2e),向此题,e代表边数,远大于n,顶点数,所以选Prim#include <iostream>
using namespace std;
const int maxn=2001;
char s[maxn][7];
int edge[maxn][maxn];
int lit[maxn];
int chan(int a,int b)
{ int amou=0; for(int i=0;i<7;i++) { if(s[a][i]!=s[b][i]) amou++; }
阅读全文

浙公网安备 33010602011771号