| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哈尔滨现场赛1003哪位大牛能给提供点数据,WA到死了。#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator