Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2016, 19:10   #1
mad_ded
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 28
Восклицание Поиск в глубину

Всем ДВС!
Поясните пожалуйста как работает эта программа. А именно как поиск в глубину помогает решить задачу http://acm.timus.ru/problem.aspx?space=1&num=1580

Код:
#include <cstdio>
#include <cstring>
#include <vector>
 
using namespace std;
 
struct edge{
    int to,sum;
    
    edge(){}
    
    edge(int to, int sum) : to(to), sum(sum) {}
};
 
vector<edge> L[1000];
bool visited[1000][2];
int value[1000][2];
double calc[1000];
 
void dfs(int pos, int d, int val){
    if(visited[pos][d]) return;
    visited[pos][d] = true;
    
    value[pos][d] = val;
    calc[pos] += val;
    
    for(int i = L[pos].size() - 1,to;i >= 0;--i)
        dfs(L[pos][i].to,d ^ 1,L[pos][i].sum - val);
}
 
int main(){
    int N,M;
    
    scanf("%d %d",&N,&M);
    
    for(int i = 0,a,b,c;i < M;++i){
        scanf("%d %d %d",&a,&b,&c);
        --a; --b;
        
        L[a].push_back(edge(b,c));
        L[b].push_back(edge(a,c));
    }
    
    memset(visited,false,sizeof(visited));
    
    for(int i = 0;i < N;++i)
        if(!visited[i][0] && !visited[i][1])
            dfs(i,0,0);
    
    bool ok = true;
    
    for(int i = 0;i < N && ok;++i){
        if(!visited[i][0] || !visited[i][1]) ok = false;
        else calc[i] /= 2;
    }
    
    for(int i = 0;i < N;++i){
        for(int j = L[i].size() - 1,to,sum;j >= 0;--j){
            to = L[i][j].to;
            sum = L[i][j].sum;
            
            if(visited[i][0] && visited[to][1] && sum != value[i][0] + value[to][1]) ok = false;
            if(visited[i][1] && visited[to][0] && sum != value[i][1] + value[to][0]) ok = false;
        }
    }
    
    if(!ok) puts("IMPOSSIBLE");
    else{
        for(int i = 0;i < N;++i)
            printf("%.1f\n",calc[i]);
    }
    
    return 0;
}
mad_ded вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DFS( поиск в глубину) MagAragorn Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2013 05:19
граф поиск в глубину revoltecklol Паскаль, Turbo Pascal, PascalABC.NET 0 14.05.2012 23:47
итеративный поиск в глубину Anastasia.K Помощь студентам 1 23.10.2011 09:21
Поиск в глубину Nicko_mt Помощь студентам 2 20.09.2011 14:15
Поиск в ширину и глубину Дядя Тёма Фриланс 0 21.05.2011 10:42