第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~
如果有小伙伴看完代码后觉得有不明白或不好的地方,可以私信或评论,一起学习。