ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1651. Кратчайшая подцепь

WA 15
Послано LastOne 30 авг 2017 07:49
Please help

#include <bits/stdc++.h>
using namespace std;
const int infInt = 1<<30;
vector<int>adj[100010];
pair<int,int> edges[100010];
int parent[100010],dist[100010];
map< pair<int,int> ,int> Map;
bool mark[100010];


void path(int u){
  if(parent[u]==u){
    cout<<edges[u].first<<" "<<edges[u].second;
    return;
  }
  path(parent[u]);
  cout<<" "<<edges[u].second;
}
int main(){
  int ant,curr,root,n;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>curr;
    if(i>0){
      edges[i].first=ant;
      edges[i].second=curr;
      adj[ant].push_back(curr);
      Map[make_pair(ant,curr)]=i;
    }

    if(i==0)
      root=curr;
    ant=curr;
  }
  if(root==curr){
    cout<<root<<endl;
    return 0;
  }
  queue<int> q;
  for(int i=1;i<n;i++){
    parent[i]=i;
    dist[i]=infInt;
    if(edges[i].first==root){
      q.push(i);
      dist[i]=0;
    }
    if(edges[i].second==curr)
      mark[i]=true;
  }

  while(!q.empty()){
    int u=q.front();
    q.pop();
    int x=edges[u].first;
    int y=edges[u].second;
    for(auto z: adj[y]){
      int v=Map[make_pair(y,z)];
      if(v>u and dist[v]>dist[u]+1){
        dist[v]=dist[u]+1;
        parent[v]=u;
        q.push(v);
      }
    }
  }
  int best=infInt,bestInd=-1;
  for(int i=1;i<n;i++){
    if(dist[i]<best and mark[i]){
      bestInd=i;
      best=dist[i];
    }
  }
  path(bestInd);
  cout<<endl;
  return 0;
}
Re: WA 15
Послано LastOne 30 авг 2017 08:51
Or this, aldo wa 15
What´s the problem??

#include <bits/stdc++.h>
using namespace std;
const int infInt = 1e9;

vector<int>adj[100010];
pair<int,int> edges[100010];
int final;
map< pair<int,int> ,int> Map;
bool mark[100010];

bool vis[100010];
int dp[100010];

int f(int u){
  if(edges[u].second==final)return 0;
  if(vis[u])return dp[u];
  vis[u]=true;
  int x=edges[u].first;
  int y=edges[u].second;
  int ans=infInt;
  for(auto z:adj[y]){
    int v=Map[make_pair(y,z)];
    if(v>u)
      ans=min(ans,1+f(v));
  }
  return dp[u]=ans;
}


void rec(int u){
  if(edges[u].second==final){
    cout<<" "<<final<<endl;
    return;
  }
  int x=edges[u].first;
  int y=edges[u].second;
  for(auto z:adj[y]){
    int v=Map[make_pair(y,z)];
    if(v>u and dp[u]==1+f(v)){
      cout<<" "<<y;
      rec(v);
      break;
    }
  }
}

int main(){
  int ant,curr,root,n;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>curr;
    if(i>0){
      edges[i].first=ant;
      edges[i].second=curr;
      adj[ant].push_back(curr);
      Map[make_pair(ant,curr)]=i;
    }

    if(i==0)
      root=curr;
    ant=curr;
    if(i==n-1)
      final=curr;
  }
  if(root==curr){
    cout<<root<<endl;
    return 0;
  }
  int best=infInt,bestInd=-1;
  for(int i=1;i<n;i++){
    if(edges[i].first==root){
      int ans=f(i);
      if(ans < best){
        best=ans;
        bestInd=i;
      }
    }
  }
  cout<<edges[bestInd].first;
  rec(bestInd);

}
LastOne писал(a) 30 августа 2017 07:49
Please help

#include <bits/stdc++.h>
using namespace std;
const int infInt = 1<<30;
vector<int>adj[100010];
pair<int,int> edges[100010];
int parent[100010],dist[100010];
map< pair<int,int> ,int> Map;
bool mark[100010];


void path(int u){
  if(parent[u]==u){
    cout<<edges[u].first<<" "<<edges[u].second;
    return;
  }
  path(parent[u]);
  cout<<" "<<edges[u].second;
}
int main(){
  int ant,curr,root,n;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>curr;
    if(i>0){
      edges[i].first=ant;
      edges[i].second=curr;
      adj[ant].push_back(curr);
      Map[make_pair(ant,curr)]=i;
    }

    if(i==0)
      root=curr;
    ant=curr;
  }
  if(root==curr){
    cout<<root<<endl;
    return 0;
  }
  queue<int> q;
  for(int i=1;i<n;i++){
    parent[i]=i;
    dist[i]=infInt;
    if(edges[i].first==root){
      q.push(i);
      dist[i]=0;
    }
    if(edges[i].second==curr)
      mark[i]=true;
  }

  while(!q.empty()){
    int u=q.front();
    q.pop();
    int x=edges[u].first;
    int y=edges[u].second;
    for(auto z: adj[y]){
      int v=Map[make_pair(y,z)];
      if(v>u and dist[v]>dist[u]+1){
        dist[v]=dist[u]+1;
        parent[v]=u;
        q.push(v);
      }
    }
  }
  int best=infInt,bestInd=-1;
  for(int i=1;i<n;i++){
    if(dist[i]<best and mark[i]){
      bestInd=i;
      best=dist[i];
    }
  }
  path(bestInd);
  cout<<endl;
  return 0;
}