7-6 链表去重 (25 分)
#include <bits/stdc++.h>
using namespace std;
struct node
{
int address,data,next;
};
int main()
{
int st,n;
cin>>st>>n;
map<int,node>mp;
int address,data,next;
for(int i=0;i<n;i++)
{
cin>>address>>data>>next;
mp[address].address=address;
mp[address].data=data;
mp[address].next=next;
}
vector<node>a,b;
map<int,int>flag;
for(int it=st;it!=-1;it=mp[it].next)
{
if(flag[abs(mp[it].data)]==1)
b.push_back(mp[it]);
else
a.push_back(mp[it]);
flag[abs(mp[it].data)]=1;
}
for(int i=0;i<a.size();i++)
{
if(i!=a.size()-1)
printf("%05d %d %05d\n",a[i].address,a[i].data,a[i+1].address);
else
printf("%05d %d -1\n",a[a.size()-1].address,a[a.size()-1].data);
}
for(int i=0;i<b.size();i++)
{
if(i!=b.size()-1)
printf("%05d %d %05d\n",b[i].address,b[i].data,b[i+1].address);
else
printf("%05d %d -1\n",b[b.size()-1].address,b[b.size()-1].data);
}
return 0;
}
7-5 树的遍历 (25 分)
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node *l;
struct node *r;
};
struct node *tree(int hou[],int zhong[],int n)
{
if(n==0)
return NULL;
int d,i;
struct node *root;
root=new node;
root->data=hou[n-1];
for(i=0;i<n;i++)
{
if(zhong[i]==hou[n-1])
break;
}
d=i;
root->l=tree(hou,zhong,d);
root->r=tree(hou+d,zhong+d+1,n-d-1);
return root;
};
int flag=0;
void cenxu(struct node *root)
{
struct node *temp[100];
int in=0,out=0;
temp[in++]=root;
while(in>out)
{
if(temp[out])
{
if(flag==0)
{
printf("%d",temp[out]->data);
flag=1;
}
else
printf(" %d",temp[out]->data);
temp[in++]=temp[out]->l;
temp[in++]=temp[out]->r;
}
out++;
}
}
int main()
{
int n;
cin>>n;
int zhong[101],hou[101];
for(int i=0;i<n;i++)
{
cin>>hou[i];
}
for(int i=0;i<n;i++)
{
cin>>zhong[i];
}
struct node *root;
root=tree(hou,zhong,n);
cenxu(root);
return 0;
}
L2-001 紧急救援 (25 分)
#include <bits/stdc++.h>
using namespace std;
int n,m,s,d;
const int maxn=550;
int city[maxn][maxn],save[maxn];
int num[maxn],cnt[maxn],pre[maxn];
int dis[maxn];
int vis[maxn]={
0};
const int inf=0x3f3f3f3f;
void dijkstra(int s)
{
int u;
num[s]=1;
cnt[s]=save[s];
for(int i=0;i<n-1;i++)
{
int minx=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==0&&dis[j]<minx)
{
minx=dis[j];
u=j;
}
}
vis[u]=1;
for(int k=0;k<n;k++)
{
if(vis[k]==0&&dis[k]>dis[u]+city[u][k])
{
dis[k]=dis[u]+city[u][k];
num[k]=num[u];
cnt[k]=save[k]+cnt[u];
pre[k]=u;
}
else if(vis[k]==0&&dis[k]==dis[u]+city[u][k])
{
num[k]=num[u]+num[k];
if(cnt[u]+save[k]>cnt[k])
{
cnt[k]=save[k]+cnt[u];
pre[k]=u;
}
}
}
}
}
void dfs(int v)
{
if(s==v)
{
cout<<s;
return;
}
else
{
dfs(pre[v]);
cout<<' '<<v;
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
city[i][j]=0;
else
city[i][j]=inf;
}
}
for(int i=0;i<n;i++)
cin>>save[i];
for(int i=0;i<m;i++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
city[t1][t2]=city[t2][t1]=t3;
}
for(int i=0;i<n;i++)
{
dis[i]=city[s][i];
}
dijkstra(s);
cout<<num[d]<<' '<<cnt[d]<<endl;
dfs(d);
return 0;
}