暑假第二周总结
这周在进行数据结构的第一阶段:
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;
}

浙公网安备 33010602011771号