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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 14:14   #1
Kobe
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 23
По умолчанию задача об источниках и потребителях

Момогите пожалуйста

Решить задачу об источниках и потребителях, сведя ее к задаче построения максимального потока в транспортной сети и используя первый алгоритм построения максимального потока.

У меня есть программам, но она не запускается. В чем дело?


Код:
#include <stdio.h>

#define MAX 110
#define inf 1e9

int x;
int y;
int m;
int tmp;
int n;
int xi;
int yi;
int cap;
int c[MAX][MAX];
int flow[MAX][MAX];
int add_g[MAX][MAX];
int chain[MAX];
int chain_it;
bool used[MAX];

template<typename T>
inline T min(T a,T b) {return (a<b)?a:b;}

bool dfs(int x)
{
	used[x] = 1;
	chain[chain_it++] = x;

	if(x == n)
		return true;

	for(int i = 0;i <= n;i++)
		if(add_g[x][i] != inf && !used[i])
		{
			bool res = dfs(i);
			if(res) return true;
		}

	chain_it--;
	return false;
}

int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);

	scanf("%d %d %d",&x,&y,&m);

	for(int i = 0;i < m;i++)
	{
		scanf("%d %d %d",&xi,&yi,&cap);
		c[xi][yi+x] = cap;
	}

	for(int i = 0;i < x;i++)
	{
		scanf("%d",&tmp);
		c[0][i+1] = tmp;
	}

	for(int i = 0;i < y;i++)
	{
		scanf("%d",&tmp);
		c[x+i+1][x+y+1] = tmp;
	}

	n = x+y+1;

	printf("Транспортная сеть:\n");
	for(int i = 0;i <= n;i++,printf("\n"))
		for(int j = 0;j <= n;j++)
			printf("%d ",c[i][j]);

	while(true)
	{
		for(int i = 0;i <= n;i++)
			used[i] = 0;

		chain_it = 0;

		for(int i = 0;i <= n;i++)
			for(int j = 0;j <= n;j++)
				add_g[i][j] = inf;

		for(int i = 0;i <= n;i++)
			for(int j = i+1;j <= n;j++)
			{
				add_g[i][j] = (flow[i][j]< c[i][j])?0:inf;
				add_g[j][i] = (flow[i][j] > 0)?0:inf;
			}

		if(!dfs(0))
			break;

		int for_add = inf;
		for(int i = 0;i < chain_it-1;i++)
			for_add = min(for_add,c[chain[i]][chain[i+1]]-flow[chain[i]][chain[i+1]]);
		for(int i = 0;i < chain_it-1;i++)
			flow[chain[i]][chain[i+1]] += for_add;
	}

	printf("Поток:\n");
	for(int i = 0;i <= n;i++,printf("\n"))
		for(int j = 0;j <= n;j++)
			printf("%d ",flow[i][j]);

	printf("Произведено:");
	for(int i = 1;i <= x;i++)
		printf("%d ",flow[0][i]);

	
	printf("\nПотреблено:");
	for(int i = x+1;i <= x+y;i++)
		printf("%d ",flow[i][n]);

	return 0;
}
Kobe вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача об источниках и потребителях Kobe Помощь студентам 8 02.07.2010 09:51
Задача по ТП. GE076 Помощь студентам 11 07.12.2007 19:29