今天收获还算可以把。。
今天过了poj1258和poj1753.
1258是一个红果果的最小生成树,写了个prim,用的邻接矩阵。
当然邻接表不是很会用,回头会研究图算法,短期内会看的。
关于prim算法,比较重要的就以下几个点。
1.选取一个点,然后据此更新其他节点的low[]信息
2.再执行n-1次操作,每次操作选取木有标记的点中low最小的那个。记得每次增加节点就要更新low数组
low[i]表示,从i节点到已经生成区域的最短路径。。
然后,其他的没什么,注意用个vis数组记录标记状态。
代码如下:poj1258
- #include <stdio.h>
- #define N 300
- #define INF 300000
- int a[N][N];
- int ans;
- int vis[N];
- int low[N];
- int prim(int n)
- {
- int i,j;
- int pos;
- /*
- * 更新low数组很重要,之前写了一个,没有更新low
- * */
- for(i=0;i<n;i++)
- {
- vis[i]=0;
- }
- vis[0] = 1;
- pos = 0;
- int min;
- int result=0; /*我屮艸芔茻,没初始化成0,,查错查了半天*/
- for(i=1;i<n;i++)
- {
- low[i] = a[pos][i];
- }
- for(j=1;j<n;j++)
- {
- min = INF;
- for(i=0;i<n;i++)
- {
- if(vis[i]==0 && min>low[i])
- {
- min = low[i];
- pos = i;
- }
- }
- vis[pos]=1;/*标记这个新加入的点已经走过*/
- result+=min;
- /* printf("min:%d,%d ",min,result);*/
- /*
- * 这是选出了新的节点,下面要更新和这个节点关联的low数组
- * */
- for(i=0;i<n;i++)
- {
- if(vis[i]==0 && a[pos][i]<low[i])/*刚开始第一个条件写成了i!=pos,这样会导致之前节点呗更新*/
- low[i] = a[pos][i];
- }
- }
- return result;
- }
- int main()
- {
- int n;
- int i,j;
- while(scanf("%d",&n)!=EOF)
- {
- for(i=0;i<n;i++)
- for(j=0;j<n;j++)
- {
- scanf("%d",&a[i][j]);
- }
- ans = prim(n);
- printf("%d ",ans);
- }
- return 0;
- }
解题报告没什么可说的了,解析prim的帖子一抓一把。
然后是做了poj1753,这题是用一个BFS做的。自己写一个循环队列。
集训结束了我会写个报告的,暂时留空做个标记在这里~~
传送门:poj1753。
然还是,听学长讲了个单调栈。
poj2559,单调栈(这题今天估计来不及看了!!学长讲的挺好的)
明后天要做掉。当然尽量把,反正这个思路特别厉害。嗯。好东西。希望有时间去做~
然后今天鱼头讲了查找和排序。
关于归并排序,快速排序,堆排序,最近几天要研究研究,,快速排序的话,这个帖子不错:
http://blog.csdn.net/morewindows/article/details/6684558
分了小组,,我是个四人小组的组长。。加油加油