Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

终于过了,一个破最大流的题搞了这么久,先是死循环TLE,然后数组越界RE,最后输出全大写WA!晕了!

Posted by KatrineYang at 2016-08-23 00:13:04 on Problem 1698
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;

const int gs = 100;
const int weeks = 500;

const int S = 2147483647, T = -10000000;
int graph[gs][weeks] = {0};
int main() {
	int cases;
	scanf("%d", &cases);
	for(int ii = 0; ii < cases; ii++){
		int N;
		scanf("%d", &N);
		int canDays[gs][7];
		int D[gs], W[gs];
		int maxW = 0;
		for(int i = 0; i < N; i++){
			for(int k = 0; k < 7; k++) scanf("%d", &canDays[i][k]);
			scanf("%d%d", &D[i], &W[i]);
			if(maxW < W[i]) maxW = W[i];
		}
		int M = 7 * maxW;
		for(int i = 0; i < N; i++)
			for(int j = 0; j < M; j++)
				graph[i][j] = 0;
		bool avl[weeks];
		for(int i = 0; i < M; i++) avl[i] = 1;
		for(int i = 0; i < N; i++){
			for(int k = 0; k < 7; k++){
				if(canDays[i][k] == 0) continue;
				for(int j = 0; j < W[i]; j++){
					graph[i][7*j+k] = 1;
				}
			}
		}
		//int flow = 0;
		while(1){
			//cout << 1 << endl;
			queue<int> bfs;
			bool sVisited[gs] = {0}, tVisited[weeks] = {0};
			int sPrev[gs], tPrev[weeks];
			for(int i = 0; i < N; i++){
				if(D[i] > 0){
					bfs.push(i);
					sVisited[i] = 1;
					sPrev[i] = S;
				}
			}
			int zhyg = T;
			while(!bfs.empty()){
				int no = bfs.front();
				bfs.pop();
				if(no < gs){
					for(int i = 0; i < M; i++){
						if(graph[no][i] == 1 && !tVisited[i]){
							tVisited[i] = 1;
							tPrev[i] = no;
							if(avl[i]){
								zhyg = i;
								goto findOne;
							}
							bfs.push(i+gs);
						}
					}
				}
				else{
					for(int i = 0; i < N; i++){
						if(graph[i][no-gs] == -1 && !sVisited[i]){
							sVisited[i] = 1;
							sPrev[i] = no;
							bfs.push(i);
						}
					}
				}
			}
			findOne:
			if(zhyg == T){
				break;
			}
			//flow ++;
			avl[zhyg] = 0;
			int cur = tPrev[zhyg];
			int suc = zhyg + gs;
			//int cnt = 0;
			while(cur < S/2){

				//cout << 1 << endl;
				if(cur < gs){
					graph[cur][suc - gs] = -1;
					suc = cur;
					cur = sPrev[cur];
				}
				else{
					graph[suc][cur - gs] = 1;
					suc = cur;
					cur = tPrev[cur - gs];
				}
			}
			D[suc] --;
		}
		bool manle = 1;
		for(int i = 0; i < N; i++){
			if(D[i] > 0){
				manle = 0;
				break;
			}
		}
		if(manle) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator