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

哈尔滨现场赛1003哪位大牛能给提供点数据,WA到死了。

Posted by freesunshine at 2008-10-27 13:16:11
#include<iostream>
#include<algorithm>

using namespace std;

const int N=110;
const int INF=99999999;
bool x[N],y[N];
int lx[N],ly[N],map[N][N],link[N];
int sum,n,mm,k,p,hash[310][310],ship[N],dis[310];
bool visit[310];

struct node
{
	int c,r;
}h[110],m[110];

int cal_abs(int val)
{
	return val > 0 ? val : -val;
}

int max(int a,int b)
{
	return a > b ? a : b;
}

int min(int a,int b)
{
	return a < b ? a : b;
}

bool dfs(int v)
{
	int t,temp;
	x[v]=true;
	for(t=1;t<=n;t++)
	{
		if(!y[t]&&lx[v]+ly[t]==map[v][t])
		{
			y[t]=true;
			temp=link[t];
			link[t]=v;
			if(temp==0||dfs(temp))
				return true;
			link[t]=temp;
		}
	}
	return false;
}
int solve()
{
	int i,j,k;
    fill(lx,lx+N,-INF);
    fill(ly,ly+N,0);
    fill(link,link+N,0);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
			lx[i]=max(lx[i],map[i][j]);
	for(i=1;i<=n;i++)
		do
		{
			fill(x,x+N,false);
			fill(y,y+N,false);
			if(dfs(i))
				break;
			int d=INF;
			for(j=1;j<=n;j++)
				if(x[j])
					for(k=1;k<=n;k++)
						if(!y[k])
							d=min(d,lx[j]+ly[k]-map[j][k]);
			for(j=1;j<=n;j++)
			{
				if(x[j])
					lx[j]-=d;
				if(y[j])
					ly[j]+=d;
			}
		}
		while(1);
	sum=0;
	for(i=1;i<=n;i++)
		sum+=map[link[i]][i];
	return sum;
}

void dijsktra(int index,int from)
{
	int i,j,count = n;
	memset(visit,0,sizeof(visit));
	memset(dis,-1,sizeof(dis));
	visit[from] = true;
	dis[from] = 0;
	for(i=1;i<=n+mm;i++)
		if(i != from && hash[from][i] != -1)
			dis[i] = hash[from][i];
	for(i=1;i<=n+mm-1;i++)
	{
		int min = INF,minindex = -1;
		for(j=1;j<=n+mm;j++)
			if(!visit[j] && dis[j] != -1 && dis[j] < min)
			{
				min = dis[j];
				minindex = j;
			}
		if(minindex == -1)
			break;
		visit[minindex] = true;
		if(minindex <= n)
		{
			map[index][minindex] = -min;
			count --;
			if(count == 0)
				break;
			continue;
		}
		for(j=1;j<=n+mm;j++)
			if(!visit[j] && hash[minindex][j] > 0 && (dis[j]== -1 || dis[j] > dis[minindex] + hash[minindex][j]))
				dis[j] = dis[minindex] + hash[minindex][j];
	}
}

int main()
{
	int i,j,k,a,b,c;
	while(scanf("%d %d %d %d",&n,&mm,&k,&p)!=EOF)
	{
		for(i=1;i<=n;i++)
			scanf("%d",&ship[i]);
			memset(hash,-1,sizeof(hash));
		for(i=1;i<=k;i++)
		{
			scanf("%d %d %d",&a,&b,&c);
			a += n; b += n;
			hash[a][b] = hash[b][a] = c;
		}
		for(i=1;i<=p;i++)
		{
			scanf("%d %d %d",&a,&b,&c);
			b += n;
			hash[a][b] = hash[b][a] = c;
		}
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				map[i][j] = -INF;
		for(i=1;i<=n;i++)
		{
			int sta = ship[i];
			dijsktra(i,sta+n);
		}
		int ans = -solve();
		if(ans < INF)
			printf("%d\n",ans);
		else printf("-1\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