今天被傻逼联通坑死了,,目前还没弄懂它坑爹的话费机制
浪费老子10块钱,,我屮艸芔茻
进入正题。。
今天用kruskal写了个题。。大致流程。,其实复杂程度和prim算法差不多。
先按照边排序,然后一个个选出来,用并查集判断是否形成环。
poj2485:
同样,回头整理的时候会给出结题报告的。
直接贴代码;
/* * ===================================================================================== * * Filename: 2485.c * * Description: poj2485 * * Version: 1.0 * Created: 2014/7/6 13:55:07 * Revision: none * Compiler: gcc * * Author: ShengRang (), 541628498@qq.com * Organization: * * ===================================================================================== */ #include <stdio.h> #define MAXSIZE 600 /* int a[MAXSIZE][MAXSIZE];*/ typedef struct{ int u; int v; int c; }node; int partition(node a[],int l,int r) { int i,j; i=l;j=r; node x = a[l]; while(i<j) { while(a[j].c >=x.c && i<j) { j--; } a[i] = a[j]; while(a[i].c <= x.c && i<j) { i++; } a[j] = a[i]; } a[i] = x; return i; } void quickSort(node a[],int l,int r) { if(l<r) { int i; i = partition(a,l,r); quickSort(a,l,i-1); quickSort(a,i+1,r); } } node a[MAXSIZE*MAXSIZE]; int e; int uset[MAXSIZE]; int find(int x) { if(uset[x] != x) { uset[x] = find(uset[x]); /* 这句话居然刚开始写错了………… */ } return uset[x]; } void makeSet(int n) { int i; for(i=0;i<n;i++) { uset[i] = i; } return; } void addNode(int i,int j,int c) { node tmp; tmp.u = i; tmp.v = j; tmp.c = c; a[e++] = tmp; } int kruskal(int n) { /* 并查集在这里起了两个作用, * 判断是否重复的边(因为输入的是邻接矩阵) * 判断是否形成回路(如果新要加入的边会形成回路,,他们的uset[u],uset[v]会一样) m用作计算是否已经圈了n-1条边(因为一个树的边是n-1) */ int ans=0; int i; int m; int px,py; for(i=0;i<e;i++) { px = find(a[i].u); py = find(a[i].v); if(px == py) continue; m++; ans = a[i].c; uset[py] = px; /* 这句话很重要 */ if(m==n-1) break; } return ans; } int main ( int argc, char *argv[] ) { int T; scanf("%d",&T); int n; int i,j,k; int x,y; while(T--) { e = 0; scanf("%d",&n); makeSet(n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&x); addNode(i,j,x); } } quickSort(a,0,e-1); /* for(i=0;i<e;i++) { printf("u:%d v:%d c:%d ",a[i].u,a[i].v,a[i].c); }*/ printf("%d ",kruskal(n)); } return 0; } /* ---------- end of function main ---------- */
然后用poj1182复习了下并查集,注意向量性的关系的使用。
贴代码
/* * ===================================================================================== * * Filename: 1182.c * * Description: poj1182 * * Version: 1.0 * Created: 2014/7/5 20:32:25 * Revision: none * Compiler: gcc * * Author: ShengRang (), 541628498@qq.com * Organization: * * ===================================================================================== */ #include <stdio.h> #define MAXSIZE 500005 int uset[MAXSIZE]; int dis[MAXSIZE]; void makeSet(int n) { int i; for(i=1;i<=n;i++) { uset[i] = i; dis[i] = 0; } return; } int find(int x) { int tmp = uset[x]; if(x != uset[x]) { uset[x] = find(uset[x]); dis[x] = (dis[x] + dis[tmp]) % 3; } return uset[x]; } void unionSet(int x,int y,int px,int py, int rela) { uset[px] = py; dis[px] = (3+rela+dis[y]-dis[x]) % 3; } int main () { int n; int k; int ans= 0; int imf; int x,y; int px,py; int rela; scanf("%d%d",&n,&k); makeSet(n); while(k--) { scanf("%d%d%d",&imf,&x,&y); if(imf==2 && x==y) { ans++; continue; } else if(x>n || y>n) { ans++; continue; } else { px = find(x); py = find(y); rela = (imf == 1)?0:1; if(px==py) { if(dis[x] != (rela+dis[y])%3) { ans++; } } else { unionSet(x,y,px,py,rela); } } } printf("%d ",ans); return 0; } /* ---------- end of function main ---------- */
然后是做了个单调栈的东西。
poj里有三题是单调栈的。今天写了第二个.poj2082。.想写poj2796,未遂
/* * ===================================================================================== * * Filename: 2082.c * * Description: poj2082 * * Version: 1.0 * Created: 2014/7/6 15:17:09 * Revision: none * Compiler: gcc * * Author: ShengRang (), 541628498@qq.com * Organization: * * ===================================================================================== */ #include <stdio.h> #define MAXSIZE 500010 typedef struct{ int start; int end; int val; }node; node stack[MAXSIZE]; int top; void push(node n) { top++; // printf("Top:%d ",top); stack[top] = n; /* printf("Push the node :val:%d,start:%d,end:%d ",n.val,n.start,n.end);*/ } node pop() { top--; /* printf("pop the node : val : %d,start %d, end : %d ",stack[top+1].val,stack[top+1].start,stack[top+1].end);*/ return stack[top+1]; } void initialise() { top = 1; node tmp; tmp.start = tmp.end = 0; tmp.val = 0; stack[0] = tmp; return; } node GetTop() { // printf("top:%d ",top); return stack[top]; } int main ( int argc, char *argv[] ) { int N; int i,j,k; int x; node tmp; node t; int ans; int curAns; while(scanf("%d",&N) != EOF, N != -1) { ans = 0; initialise(); x = 0; tmp.end = tmp.start = 0; for(i=1;i<=N+1;i++) { if(i==N+1) { tmp.val = 0; tmp.start = tmp.end; } else { scanf("%d%d",&x,&tmp.val); tmp.start = tmp.end; tmp.end+=x; } /* printf("current node whose VAL is:%d,Start:%d,end:%d ",tmp.val,tmp.start,tmp.end);*/ /* printf("Top:%d,val:%d,start:%d,end:%d ",top,GetTop().val,GetTop().start,GetTop().end);*/ while(GetTop().val > tmp.val) { // printf("111111~~ "); t = pop(); curAns = (tmp.start-GetTop().end)*t.val; /* printf("Current Ans:%d ",curAns);*/ if(curAns > ans) ans = curAns; } push(tmp); } printf("%d ",ans); } return 0; } /* ---------- end of function main ---------- */
明天要做个最小生成树的报告。今天实在不知道要写点什么。。就这样吧。感觉有点盲目,,不应该这样的。。
明天看看动态规划或者地杰斯特拉,或者把归并和堆排序看了。
然后打算写几个没内容的帖子,,记录一些做掉的题目的poj专题
先这样,晚安