SDUTACM春季集训选拔赛(19级)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值