暑假第二周总结

这周在进行数据结构的第一阶段:

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;
}

  

posted @ 2022-07-23 10:05  炽灬  阅读(36)  评论(0)    收藏  举报