摘要:
最短路入门经典题题意是输入n表示n个点从1到n标号,n=0结束程序然后给出n*n的邻接矩阵,g[i][j]=-1表示i->j没有通路然后有多个查询,输入u,v,输出u->v的最短路并且打印字典序最小的路径,查询以-1 -1结束//除了边的权值之外每个点还附带一个权值,所以在松弛操作的时候要把点的权值也计算进去//另外在总费用最小的情况下要输出字典序最小的路径,同样是在松弛操作那里处理//如果能更新d[i]使d[i]变小则直接更新//如果是与d[i]相同则判断一下如果更新的话会不会使路径的字典序更小,如果能才更新否则不更新//因为由多个查询,显然是用Floy来处理更好,当然也可以写一 阅读全文
摘要:
UVA 其实挺折腾的,题目超长,然后题意可能很水,输入输出又奇葩,当做是磨练其实是最短路径的裸题。固定有20个点点,输入分为两部分,前部分有19行,每一行先输出一个n,表示这行有n个数字,然后输入n个数字。第i行输出的数字v表示i和v之间有边而且是无向边,所有边的权值都是1。输入的后部分是先输入一个m,表示有m个查询,下面m行输入点u,v输出两点间的最短路径显然就是Floy算法的裸题。但是新学了spafa,把spfa也放上来注意的是有20个点从1标号到20,但是输入只有19行,再者就是输出的格式也要注意,本题1Y,当做是练手啦SPFA//先给出spafa算法//这个代码中是得到了邻接矩阵后再输 阅读全文
摘要:
最短路径裸题 ,用了dijkstra , Floy , Bellman-Floy 算法实现,纯粹练手Dijkstra_数组模拟邻接表_优先队列STL实现#include <cstdio>#include <cstring>#include <queue>#include <utility>#define N 210#define M 2020 //有1000条无向边,要转化为两条有向边保存#define INF 0x3f3f3f3fusing namespace std;typedef pair<int,int> pii;struct 阅读全文
摘要:
最小生成树裸题,给出n个点的坐标,求MST的权值总和,用prim实现#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>#define INF 100000000.0#define N 110using namespace std;double x[N],y[N],dis[N][N],lowcoat[N];bool vis[N];int n;double DIS(int i , int j){ return sqrt( (x[i]-x[j])*(x[i 阅读全文
摘要:
这个OJ比较折腾,中文注释什么的都要注意,本来代码是1Y的,但是因为中文注释的问题CE和TLE了无数次,把中文注释消掉一部分后就AC了,一位同学说是中文注释的换行问题,所以如果这个代码copy过去不能AC而是什么CE,TLE甚至WA的话,那不是代码的问题应该是一些细节问题,可以搞搞中文注释什么的大概就过了最短路径的变形给出有向边u->v,后面跟两个数据一个是走这条边要用的时间,之后是到达v点后会有红绿灯,每次红绿灯的时间,,一开始所有红绿灯都是从红灯开始的用dij算法来时间,具体的做法只是修改了一下dij算法的模板//判断红绿灯的方法是 当前是时间t和这个点的红绿灯时间w//(t/w)% 阅读全文
摘要:
搜索水题,其实就是一个图的遍历(因为放在数据结构图专题中)给你一个图,以一整行的"_________"作为这个图的结束然后"X"表示不能到达,空格是能到达的,"*"也是可以到达的,并且是一个起点,要求从所有的起点出发,能到达的地方都标记为"#"然后输出标记后的整个图,"_______"也是要输出的另外注意这个图不一定是一个矩阵,可能是不规则的,例如XXXXXXXXXX X XX * XX X XXXXXXXXXXX XX XX XXXXXX_____当然这些都是没有关系的,就直接遍历好了,已经标 阅读全文
摘要:
欧拉回路裸题,给定n个点和m条有向边,判断该图是否为欧拉回路有向图欧拉回路判断条件有:图连通,所有点的度为偶数代码一,用并查集来判断图是否连通,然后逐一扫描所有点的度是否为偶数#include <stdio.h>#include <string.h>#define N 110int n,m;int d[N];int p[N];int find(int x) //并查集{ return p[x]==x ? x : find(p[x]); }int main(){ int CASE,i,j,u,v,x,y,ok; scanf("%d",&CASE 阅读全文
摘要:
题意:一个三维方块,给出高长宽,并且按照从最低面一层(或者从最顶面一层)到最高一层逐层给出这个方块的信息。S表示起点E表示终点,#表示这个格子不能走, .表示这个格子能走,走的方向有6个,前后左右上下。能是否能从起点走到终点,若能输出最少的步数首先想到的DFS+剪枝,后来TLE了,才自己脑子又进水了,应该用BFS,因为剪枝的话效率不高,而且题目求最小步数,显然符合BFS的特点从起点开始,将它能走的6个方向的格子且满足条件的格子入队,满足条件是指,这个格子还在方块内,而且能走,而且没有走过一开始没有记录一个格子是否走过就TLE了,又脑子进水了显然是要记录的………………如果队中某个格子就是终点的格 阅读全文
摘要:
其实题意不是很明白,看了别人的解题报告然后按照思路来实现,最后AC了,但是对于题意还是很有问题判断是否有欧拉回路,图要连通(用并查集来处理),然后所有顶点的度数为偶数在这个博客中http://www.cnblogs.com/penseur/archive/2011/02/28/1967412.html说输入的边中要包含所有的点才是存在,但是按照这个AC代码以及网上找回来的大部分代码表明是不需要包括所有代码的例如10 28 99 8输出Possible按照这个AC代码的意思应该是前面的点可以不存在,但是一旦出现了第i个点,那么必须从第i个点到第n-1个点都存在,而且图连通,度为偶数,才存在欧拉回 阅读全文
摘要:
//滑雪,记忆化搜索解决//dp[i][j]表示从(i,j)开始出发所能滑的最长长度//显然状态转移方程为dp[i][j]=max{上下左右四个方向的dp值}+1;//我们只需要在DP过程中时刻更新最大值MAX即可#include <stdio.h>#include <string.h>#define N 110int R,C;int a[N][N],dp[N][N],MAX;bool vis[N][N];int x[5]={0,-1,1,0,0}, y[5]={0,0,0,-1,1};void DP(int i , int j){ int k,xx,yy,tmp; i 阅读全文