| ||||||||||
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