浙大MOOC《数据结构》PTA代码

第1题-01-复杂度1 最大子列和问题
第2题-01-复杂度2 Maximum Subsequence Sum
第3题-02-线性结构2 一元多项式的乘法与加法运算
第4题-浙大MOOC《数据结构》PTA第4题 Reversing Linked List
第8题-03-树3 Tree Traversals Again
第14题-05-树9 Huffman Codes
3、12、16依然有点小BUG

18、07-图4 哈利·波特的考试(floyd算法)

#include <iostream>
#include <vector>
#include <stack>
#include <math.h>
#include <queue>
#include <algorithm>
#define Infinity 100001
using namespace std;
int N,M;
int main()
{
    cin>>N>>M;
    int D[N+1][N+1];
    int v1,v2,len;
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            D[i][j]=Infinity;
        }
    }
    for(int i=0;i<M;i++)
    {
        cin>>v1>>v2>>len;
        D[v1][v2]=len;
        D[v2][v1]=len;
    }
    int H[N+1][N+1];
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            H[i][j]=D[i][j];
        }
    }
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            if(j==i)continue;
            if(H[i][j]<Infinity)
            {
                for(int k=1;k<=N;k++)
                {
                    if(k==i)continue;
                    if(D[j][k]<Infinity)
                    {
                        H[i][k]=min(H[i][k],H[i][j]+D[j][k]);
                    }
                }
            }
        }
    }
    int m_idx=0;
    int m_num=Infinity;
    for(int i=1;i<=N;i++)
    {
        int tmp_num=0;
        for(int j=1;j<=N;j++)
        {
            if(j==i)continue;
            tmp_num=max(tmp_num,H[i][j]);
        }
        if(m_num>tmp_num)
        {
            m_num=tmp_num;
            m_idx=i;
        }
    }
    cout<<m_idx<<" "<<m_num;
    system("pause");
}

19、07-图5 Saving James Bond - Hard Version(单源无权最短路)

#include <iostream>
#include <vector>
#include <stack>
#include <math.h>
#include <queue>
#include <algorithm>
#define R 15
#define BOUND 50
using namespace std;
struct VNode
{
    int x;
    int y;
    int parent;
    int idx;
    bool visited;
};
bool CanJump(struct VNode v1,struct VNode v2,int d)
{
    return sqrt(pow((v1.x-v2.x),2)+pow((v1.y-v2.y),2))<=d?true:false;
}

int main()
{
    int n,jd;
    cin>>n>>jd;
    vector<struct VNode> vertexs(n,{0,0,-1,false});
    queue<int > q;
    struct VNode start{0,0,-1,0};
    for(int i=0;i<n;i++)
    {
        cin>>vertexs[i].x>>vertexs[i].y;
        vertexs[i].idx=i;
        if(CanJump(start,vertexs[i],jd+15))
        {
            q.push(i);
            vertexs[i].visited=1;
        }
    }
    bool flag=0;
    
    while(!q.empty()&&flag==0)
    {
        start=vertexs[q.front()];
        q.pop();
        for(int i=0;i<n;i++)
        {
            if(vertexs[i].visited)
            {
                continue;
            }
            if(CanJump(start,vertexs[i],jd))
            {
                q.push(i);
                vertexs[i].parent=start.idx;
                vertexs[i].visited=1;
                if(50-abs(vertexs[i].x)<=jd||50-abs(vertexs[i].y)<=jd)
                {
                    flag=1;
                    break;
                }
            }
            
        }
    }
    if(!flag)
    {
        cout<<0;
        system("pause");
        return 0;
    }
    stack<struct VNode> s;
    int idx=q.back();
    while (idx!=-1)
    {
        s.push(vertexs[idx]);
        idx=vertexs[idx].parent;
    }
    if(!s.empty())printf("Yes");
    else printf("No");
    // cout<<s.size()+1<<endl;
    // while(!s.empty())
    // {
    //     cout<<s.top().x<<" "<<s.top().y<<endl;
    //     s.pop();
    // }
    // system("pause");
    return 0;
}

20、07-图6 旅游规划

#include <iostream>
#include <cstdio>
using namespace std;
const INF =0x3f3f3f3f;
int ways[505][505][2];//秒啊,三维数组既存储了任意两城市的长度,又存储了花费
int dist[505],cost[505];//由于程序只接收一次始末点输入,故dist[i]、
//cost[i]表示起点到第i个城市的长度和花销
bool visit[505]={false};//由算法性质知,它只要访问过,即为最短路径
int n,m ,st,ov;
void init_graph() {
	for(int i = 0; i < n; i++) 
		for(int j = 0; j < n; j++)
			ways[i][j][0] = ways[i][j][1] = INF;
}
void init_d_c()
{
    for(int i=0;i<n;i++)
    {
        dist[i]=ways[st][i][0];
        cost[i]=ways[st][i][1];
    }
}

void dijkstra()
{
    visit[st]=true;
    int minpoint=n;
    for(int i1=0;i1<n;i1++)
    {
        if((!visit[i])&&(dist[i]<dist[minpoint]))
        minpoint=i;
    }
    if(minpoint==n)break;
    visit[minpoint]=true;
    for(int i=0;i<n;++i)
    {
        if(!visit[i]&&(dist[i]>dist[minpoint]+ways[minpoint][i][0]))
        {
            dist[i]=dist[minpoint]+ways[minpoint][i][0];
            cost[i]=ways[minpoint][i][1]+cost[minpoint];
        }
        else if(!visit[i]&&(dist[i]==dist[minpoint]+ways[minpoint][i][0])
        &&(cost[i]>cost[minpoint]+ways[minpoint][i][1]))
        cost[i]=(cost[minpoint]+ways[minpoint][i][1]);
    }
}

int main()
{
    cin>>n>>m>>st>>ov;
    int a,b,c,d;
    init_graph();
    for(int i=0;i<m;i++){
        cin>>a>>b>>c>>d;
        ways[a][b][0]=ways[b][a][0]=c;
        ways[a][b][1]=ways[b][a][1]=d;
    }
    init_d_c();
    dist[n]=INF;
    dist[st]=cost[st]=0;
    dijkstra();
    cout<<dist[ov]<<' '<<cost[ov];
    return 0;
}
/*我稀罕赵嘉丽*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 505;
const int inf  = 0x3f3f3f;
int N,M,S,D,u,v,len,p;
struct Edge {
    int len, pay;
}e[maxn][maxn];
int dist[maxn];
int cost[maxn];
bool vis[maxn];
void init() {
    for(int i = 0; i <= N; ++i) {
        for(int j = 0; j <= N; ++j) {
            e[i][j].pay = e[i][j].len = inf;
        }
        e[i][i].pay = e[i][i].len = 0;
    }
    memset(vis, 0, sizeof(vis));
}
void Dijstra(int u) {
    for(int i = 0; i < N; ++i) {
        dist[i] = e[u][i].len;
        cost[i] = e[u][i].pay;
    }
    for(int i = 1; i <= N; ++i) {
        int t, mindis = inf;
        for(int j = 0; j < N; ++j) {
            if(!vis[j] && dist[j] <= mindis) {
                mindis = dist[j];
                t = j;
            }
        }
        vis[t] = true;
        for(int j = 0; j < N; ++j) {
            if(vis[j] || e[t][j].len == inf) continue;
            if(dist[j] > e[t][j].len + dist[t]) {
                dist[j] = e[t][j].len + dist[t];
                cost[j] = e[t][j].pay + cost[t];
            } else if(dist[j] == e[t][j].len + dist[t]) {
                if(cost[j] > e[t][j].pay + cost[t]) {
                    cost[j] = e[t][j].pay + cost[t];
                }
            }
        }
    }
}
int main(){
    scanf("%d %d %d %d", &N, &M, &S, &D);
    init();
    while(M--) {
        scanf("%d %d %d %d", &u, &v, &len, &p);
        e[u][v].len = e[v][u].len = len;
        e[u][v].pay = e[v][u].pay = p;
    }
    Dijstra(S);
    printf("%d %d\n", dist[D], cost[D]);
    return 0;
}

以上两个版本的代码分别来自大神 来老铁干了这碗代码余cos,刚开始听不懂课(指代码实现困难,但听了至少三遍),按照main函数、main函数中子函数的逻辑顺序敲了一遍,突然明白了。

21、08-图7 公路村村通(邻接矩阵版本)

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int INF =0x3f3f3f3f;
int ways[1001][1001];
bool visit[1001]={false};
vector<int> m_tree;//存储已经连接的最小树节点
int n,m ,st=2;
void init_graph() {
	for(int i = 0; i <= n; i++) 
		for(int j = 0; j <= n; j++)
        {
            if(i==j)ways[i][j]  = 0;
            else ways[i][j]  = INF;
        }
}

int prim()
{
    m_tree.push_back(st);
    int sum=0;
    bool f=0;
    while(m_tree.size()<n)
    {
        f=0;
        int next=0;
        int min_c=INF;
        for(int i=0;i<m_tree.size();i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(visit[j]==0&& ways[m_tree[i]][j]<min_c)
                {
                    min_c=ways[m_tree[i]][j];
                    next=j;
                    f=1;//当前最小树与其他节点之间有至少一条路
                }
            }
        }
        visit[next]=1;
        m_tree.push_back(next);
        if(f)
            sum+=min_c;
        else
            break;
    }
    if(!f||m_tree.size()<n)
    {
        return -1;
    }
    else
    {
        return sum;
    }
}

int main()
{
    cin>>n>>m;
    int a,b,c;
    init_graph();
    visit[st]=1;
    for(int i=0;i<m;i++){
        cin>>a>>b>>c;
        ways[a][b]=ways[b][a]=c;
    }
    cout<<prim();
    //system("pause");
    //用于测试结果
    return 0;
}

22、08-图8 How Long Does It Take

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define MAX 100
using namespace std;
const int INF =0x3f3f3f3f;
int N,M;
queue<int> q;
bool visited[MAX]={false};
struct PNode
{
    int time;
    vector<vector<int> > prt_time;
    int parents;
}Points[MAX];
int Top_Sort()
{
    int cnt=0;
    struct PNode tmp;
    while(cnt<N)
    {
        
        for(int i=0;i<N;i++)
        {
            if(!visited[i]&&Points[i].parents==0)
            {
                q.push(i);
                visited[i]=1;
            }
        }
        if(q.empty())
        {
            break;
        }
        while(q.size())
        {
            tmp=Points[q.front()];
            q.pop(); 
            cnt++;
            while(tmp.prt_time.size())
            {
                int s=tmp.prt_time.size()-1;
                int a=tmp.prt_time[s][0];
                int b=tmp.prt_time[s][1];
                tmp.prt_time.pop_back();
                Points[a].time=max(tmp.time+b,Points[a].time);
                Points[a].parents--;
            }
        }
    }
    if(cnt==N)
    {
        return tmp.time;
    }
    else
    {
        return -1;
    }
}
int main()
{
    cin>>N>>M;
    int a,b,c;
    int cnt=0;
    int rear=-1;
    
    for(int i=0;i<N;i++)
    {
        Points[i].time=0;
        Points[i].parents=0;
    }
    for(int i=0;i<M;i++)
    {
        cin>>a>>b>>c;
        Points[a].prt_time.push_back({b,c});
        Points[b].parents++;
    }
    
    int ans=Top_Sort();
    if(ans==-1)
    {
        cout<<"Impossible";
    }
    else
    {
        cout<<ans;
    }
    //system("pause");
    return 0;
}

持续更新ing~
如果有小伙伴看完代码后觉得有不明白或不好的地方,可以私信或评论,一起学习。

内容如下: ├─程序例子 │ │ Gauss.cpp │ │ MOVE.C │ │ RUIYUE_3.C │ │ RUIYUE_4.C │ │ │ ├─1概述 │ │ bb_sort.cpp │ │ ex1-9.cpp │ │ ex1-91.cpp │ │ │ ├─2线性表 │ │ ex2-11.cpp │ │ ex2-11new.cpp │ │ linklist.cpp │ │ linklist.h │ │ LINKQUEU.C │ │ linkqueue.cpp │ │ linkqueue.h │ │ list.c │ │ LIST2.C │ │ LIST_S15.C │ │ LIST_SL.C │ │ LIST_SQ.C │ │ LIST_SQ5.C │ │ new2-11.cpp │ │ old2-11.cpp │ │ SQLIST.C │ │ Sqlist.cpp │ │ UNION.CPP │ │ │ ├─3堆栈与队列 │ │ bank_simulation.cpp │ │ conversion.cpp │ │ DMXSTACK.C │ │ hanoi.cpp │ │ MAZE.CPP │ │ QUEUE09.C │ │ SQQUEUE.C │ │ Sqqueue.cpp │ │ sqstack.cpp │ │ stack.c │ │ STK_9.C │ │ 表达式求值.cpp │ │ │ ├─5数组 │ │ array.c │ │ array_ex.cpp │ │ array_test.cpp │ │ DK1.c │ │ DK2.c │ │ SANYANZU.C │ │ │ └─6树 │ bitree.cpp │ BITREE11.C │ bitree2.cpp │ BITREE23.C │ BITREE9.C │ Create_bitree.c │ inorder_thr_tree.cpp │ intreading.cpp │ TING6.C │ TRAVERSE.C │ └─课件 sjjg答疑.txt 数据结构1概述.ppt 数据结构2线性表1.ppt 数据结构3线性表2.ppt 数据结构4堆栈与队列1.ppt 数据结构5堆栈与队列2.ppt 数据结构6串.ppt 数据结构7数组1.ppt 数据结构8数组2.ppt 数据结构9树1.ppt 数据结构A树2.ppt 数据结构B树3.ppt 数据结构C图1.ppt 数据结构D图2.ppt 数据结构E查找.ppt 数据结构F排序.ppt 数据结构文稿14.ppt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ㄨㄛˇㄞˋㄋㄧˇ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值