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

Re:幽幽道~~~还是数组开小了~~~~

Posted by eche at 2012-03-05 22:12:19 on Problem 1087
In Reply To:幽幽道~~~还是数组开小了~~~~ Posted by:eche at 2012-03-05 21:55:54
> 水题陷阱多。一开始数组开的512,WA了2次,反复检查算法无误,把Discuss里的数据一组组测,结果一个output是49的测出来是51,其他都对,纠结N久找不出原因,结果羞愤中把数组开到1000,奇迹般地跳正确结果49了,赶紧提交终于0msAC……经实验可以至少要开到560才行……

找到原因了,最大流每一步求出增长路径后,都要添加一条相应反向路径,我忘把这些反向路径的开销考虑进去,导致边数组开小了(我用的是游标数组实现的邻接链表表示法)。用邻接表的优势是占用内存少,遍历相邻边效率更高,注意点是添加边的时候一定要检查该边是否已存在,若存在仅更新边上的权即可。

附个AC代码供参考,因为作练习用,所以什么都自己写了,显得繁琐了

#include <stdio.h>
#include <string.h>

#define INFINITY 65535
#define STRLEN 25
#define ARCNUM 600
#define VNUM 600
#define HASHSIZE 1207

int n,m,k;
char str1[STRLEN],str2[STRLEN];

//Graph

struct ArcNode
{
	int adjvex;
	int cost;
	int next;
}arcs[ARCNUM];

struct VNode
{
	int firstarc;
}nodes[VNUM];

void InitArcs()
{
	int i;
	for(i=0;i<ARCNUM-1;++i)
		arcs[i].next = i+1;
	arcs[i].next = 0;
}

void InitNodes()
{
	for( int i = 0; i<VNUM; ++i )
		nodes[i].firstarc = 0;
}

int CursorAlloc()
{
	int p;
	p = arcs[0].next;
	arcs[0].next = arcs[p].next;
	return p;
}

void CursorFree(int p)
{
	arcs[p].next = arcs[0].next;
	arcs[0].next = p;
}

int InsertArc(int from, int to, int cost)
{
	int p = CursorAlloc();
	arcs[p].adjvex = to;
	arcs[p].cost = cost;
	arcs[p].next = nodes[from].firstarc;
	nodes[from].firstarc = p;
	return p;
}

int FindArc(int from, int to)
{
	int p;
	for( p = nodes[from].firstarc; p != 0 && arcs[p].adjvex != to; p = arcs[p].next );
	return p;
}

//Hash

int NodeID;

struct HashEntry
{
	char nodename[STRLEN];
	int id;
	bool filled;
}hashtable[HASHSIZE];


void InitHash()
{
	for(int i=0;i<HASHSIZE;++i)
		hashtable[i].filled = false;
	NodeID = 3; // 1:start 2:end
}

unsigned int Hash(char* key)
{
	unsigned int hash_v = 0;
	while(*key!='\0')
		hash_v += (hash_v<<5)+*key++;
	return hash_v % HASHSIZE;
}

unsigned int Find(char* key)
{
	unsigned int pos,collisionNum;
	pos = Hash(key);
	collisionNum = 0;
	while( hashtable[pos].filled && strcmp(hashtable[pos].nodename,key) != 0 )
	{
		pos += 2*++collisionNum-1;
		if(pos>=HASHSIZE)
			pos-=HASHSIZE;
	}
	return pos;
}

void Insert(char* key)
{
	unsigned int pos = Find(key);
	if( !hashtable[pos].filled )
	{
		strcpy(hashtable[pos].nodename, key);
		hashtable[pos].id = NodeID++;
		hashtable[pos].filled = true;
	}
}

//Queue
int queue[VNUM];
int front,rear,size;

void InitQueue()
{
	front = rear = size = 0;
}

bool isEmpty()
{
	return size == 0;
}

bool isFull()
{
	return size == VNUM;
}

void Enqueue(int x)
{
	if(isFull())
		return;
	size++;
	queue[rear++] = x;
	if( rear == VNUM )
		rear = 0;
}

int Dequeue()
{
	if(isEmpty())
		return 0;
	size--;
	int rslt = queue[front++];
	if( front == VNUM )
		front = 0;
	return rslt;
}

//ShortestPath

int dist[VNUM]; //到达该点最短路径的边最小花费
int from[VNUM];

void InitShortestPath()
{
	for(int i = 0; i< VNUM; ++i)
	{
		dist[i] = INFINITY;
		from[i] = 0;
	}
}

bool ShortestPath()
{
	int p,q;
	InitShortestPath();
	InitQueue();
	dist[1] = 0;
	Enqueue(1);
	while(!isEmpty())
	{
		p = Dequeue();
		for( q = nodes[p].firstarc; q != 0; q = arcs[q].next )
		{
			if( arcs[q].cost != 0 && dist[arcs[q].adjvex] == INFINITY )
			{
				if( p == 1 )
					dist[arcs[q].adjvex] = arcs[q].cost;
				else
					dist[arcs[q].adjvex] = arcs[q].cost < dist[p] ? arcs[q].cost : dist[p];
				from[arcs[q].adjvex] = p;
				Enqueue(arcs[q].adjvex);
			}
		}
	}
	if( from[2] != 0 )
		return true;
	else
		return false;
}

//MaxStream

int MaxStream()
{
	int p, q;
	int curStream,totalStream = 0;
	int arc;
	while( ShortestPath() )
	{		
		curStream = dist[2];
		totalStream += dist[2];
		for( q = 2, p = from[q]; p != 0; q = p, p = from[q] )
		{
			arc = FindArc(p,q);
			arcs[arc].cost -= curStream;

			arc = FindArc(q,p);
			if(!arc)
				arc = InsertArc(q,p,0);	
			arcs[arc].cost += curStream;
		}
	}
	return totalStream;
}

int main()
{
	//freopen("D:\input.txt","r",stdin);
	int i;
	int from,to;
	int arc;
	InitHash();
	InitArcs();
	InitNodes();
	scanf("%d",&n);
	for(i=0;i!=n;++i)
	{
		scanf("%s",str1);
		Insert(str1);
		from = hashtable[Find(str1)].id;

		arc = FindArc(from,2);
		if(!arc)
			arc = InsertArc(from,2,0);
		arcs[arc].cost++;
	}

	scanf("%d",&m);
	for(i=0;i!=m;++i)
	{
		scanf("%s%s",str1,str2);
		from = Find(str1);
		if( !hashtable[from].filled )		
			Insert(str1);					
		from = hashtable[from].id;

		to = Find(str2);
		if( !hashtable[to].filled )
			Insert(str2);
		to = hashtable[to].id;

		arc = FindArc(1,from);
		if(!arc)
			arc = InsertArc(1,from,0);
		arcs[arc].cost++;

		arc = FindArc(from,to);
		if(!arc)
			arc = InsertArc(from,to,0);
		arcs[arc].cost++;
	}

	scanf("%d",&k);
	for(i=0;i!=k;++i)
	{
		scanf("%s%s",str1,str2);
		from = Find(str1);
		if( !hashtable[from].filled )		
			Insert(str1);
		from = hashtable[from].id;

		to = Find(str2);
		if( !hashtable[to].filled )
			Insert(str2);
		to = hashtable[to].id;

		arc = FindArc(from,to);
		if(!arc)
			InsertArc(from,to,INFINITY);
	}

	printf( "%d\n", m - MaxStream() );
	//fclose(stdin);
	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