暑假第二周总结
这周在进行数据结构的第一阶段:
6-1 查找二叉排序树
int SearchBST(BSTNode *bt,KeyType k){ if(k>bt->key){ printf("%d ",bt->key); if(bt->rchild==NULL) { return 0; } SearchBST(bt->rchild,k); } if(k<bt->key){ printf("%d ",bt->key); if(bt->lchild==NULL) { return 0; } SearchBST(bt->lchild,k); } if(k==bt->key){ printf("%d ",bt->key); return 1; } }
7-1 jmu-ds-实现KMP
#include <stdio.h> #include<string.h> void get_next(char str[], int len, int next[]) { int i = 0, j = 0; next[0] = -1; for (i = 1; i < len; i++) { while (j > 0 && str[i] != str[j]) j = next[j-1]; if (str[i] == str[j]) j++; next[i] = j; } } int find_pattern(char s[], int len_s, char t[], int len_t, int next[]) { int i = 0, j = 0; while(i < len_s && j < len_t) { if(j == -1 || s[i] == t[j]) { j++; i++; } else{ j = next[j]; } } if(j == len_t) return i - j ; else return -1; } int main() { int cas,a; char s[20000], t[20000]; int next[20000]; scanf("%d", &cas); while (cas --) { scanf("%s %s", s, t); int len_s = strlen(s); int len_t = strlen(t); get_next(t, len_t, next); a=find_pattern(s, len_s, t, len_t, next); if(a==-1) printf("not find!\n"); else printf("%d\n", a); } return 0; }
7-2 关键路径
#include<iostream> #include<queue> #include<cmath> #include<cstring> using namespace std; #define MAX 200 int edges[MAX][MAX]; int in[MAX] = { 0 }; int out[MAX] = { 0 }; int early[MAX] = { 0 }; int late[MAX]; int max1[1]={0}; int s[MAX]={0}; int ne, nv; int l=0; int temp1=0; int earlytime() { int cnt = 0; queue<int>qu; for (int i = 1; i <= nv; i++) { if (in[i] == 0) qu.push(i); } while (!qu.empty()) { int temp = qu.front(); cnt++; qu.pop(); for (int i = 1; i <= nv; i++) { if (edges[temp][i] != 10000) { in[i]--; early[i] = max(early[i], early[temp] + edges[temp][i]); if (in[i] == 0)qu.push(i); } } } if (cnt != nv) return -1; else { int amount = -999; for (int i = 1; i <= nv; i++) { if (early[i] > amount) amount = early[i]; } return amount; } } void latet latetime(int count) { queue<int>qu; for (int i = 1; i <= nv; i++) { if (out[i] == 0) { qu.push(i); late[i] = count; } } while (!qu.empty()) { int temp = qu.front(); qu.pop(); for (int i = nv; i >=1; i--) { if (edges[i][temp] != 10000) { out[i]--; late[i] = min(late[i], late[temp] - edges[i][temp]); if (out[i] == 0) qu.push(i); } } } } int main() { int n, m; while(cin >> n >> m){ nv = n; ne = m; memset(in,0,sizeof in); memset(out,0,sizeof out); memset(early,0,sizeof early); memset(late,0,sizeof late); memset(s,0,sizeof s); for (int i = 0; i < MAX; i++) { late[i] = 10000; for (int j = 0; j < MAX; j++) { edges[i][j] = 10000; } } for (int i = 1; i <= ne; i++) { int a, b, c; cin >> a >> b >> c; edges[a][b] = c; in[b]++; out[a]++; } int count = earlytime(); if (count == -1) { cout << "unworkable project"<<endl; continue; } latetime(count); cout << count << endl; for (int i = 1; i <= nv; i++) { for (int j = nv; j >= 1; j--) { if (edges[i][j] != 10000&&late[j] - early[i]==edges[i][j]) { s[2*l]=i; s[2*l+1]=j; ++l; max1[0]++; } } } for(int k =0;k<max1[0];k++){ if(s[2*k]==s[2*k+2]){ if(s[2*k+1]>s[2*k+3]){ temp1=s[2*k+1]; s[2*k+1]=s[2*k+3]; s[2*k+3]=temp1; } } } for(int k=0;k<max1[0];k++){ cout<<s[2*k]<<"->"<<s[2*k+1]<<endl; } } }
7-3 修建道路
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; const int N=100010,M=200010; int fa[N],n; struct edges{ int u,v,d; }e[M]; int cnt; bool cmp(edges a,edges b){ return a.d<b.d; } int find(int x){ return fa[x]==x?fa[x]:fa[x]=find(fa[x]); } ll dijkstra(int m){ ll res=0; int k=0; for(int i=0;i<cnt;i++){ int u=e[i].u,v=e[i].v,d=e[i].d; int fu=find(u),fv=find(v); if(fu!=fv){ res+=d; fa[fu]=fv; k++; } } return k==n-1-m?res:0x3f3f3f3f; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ fa[i]=i; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int x; cin>>x; if(i>j){ e[cnt++]={i,j,x}; } } } int m; cin>>m; for(int i=0;i<m;i++){ int u,v; cin>>u>>v; int fu=find(u),fv=find(v); if(fu!=fv){ fa[fu]=fv; } } sort(e,e+cnt,cmp); ll res=dijkstra(m); if(res!=0x3f3f3f3f){ cout<<res<<endl; } else{ cout<<"impossible"<<endl; } return 0; }
7-4 先序和中序构造二叉树
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100010; int n; int pre[N],med[N],post[N]; int cnt; void dfs(int pl,int pr,int ml,int mr){ if(pl==pr){ post[++cnt]=pre[pl]; return; } int idx=ml; while(med[idx]!=pre[pl]&&idx<=n){ idx++; } if(idx!=ml) dfs(pl+1,pl+(idx-ml),ml,idx-1); if(idx!=mr) dfs(pl+(idx-ml)+1,pr,idx+1,mr); post[++cnt]=pre[pl]; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>pre[i]; } for(int i=1;i<=n;i++){ cin>>med[i]; } dfs(1,n,1,n); for(int i=1;i<=n;i++){ cout<<post[i]<<" "; } return 0; }