| ||||||||||
| 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 | |||||||||
求助,大牛给看看吧,一直wa#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
#define V 500
#define E 200000
#define inf 1000100000
struct Edge{
long long u,v,c,next;
}edge[E*2];
long long cnt,dist[V],head[V],que[V],sta[V];
long long f,p,sum,ox[250],maxx[250],map[250][250],ll,rr,mid;
long long dinic(long long s,long long t){
long long ans=0;
while(true){
long long left,right,u,v;
memset(dist,-1,sizeof(dist));
left=right=0;
que[right++]=s;
dist[s]=0;
while(left<right){
u=que[left++];
for(int k=head[u];k!=-1;k=edge[k].next){
u=edge[k].u;
v=edge[k].v;
if(edge[k].c>0 && dist[v]==-1){
dist[v]=dist[u]+1;
que[right++]=v;
if(v==t){
left=right;
break;
}
}
}
}
if(dist[t]==-1) break;
long long top=0;
long long now=s;
while(true){
if(now!=t){
long long k;
for(k=head[now];k!=-1;k=edge[k].next){
if(edge[k].c>0 && dist[edge[k].u]+1==dist[edge[k].v]) break;
}
if(k!=-1){
sta[top++]=k;
now=edge[k].v;
}
else{
if(top==0) break;
dist[edge[sta[--top]].v]=-1;
now=edge[sta[top]].u;
}
}
else{
int flow=inf,ebreak;
for(int i=0;i<top;i++){
if(flow>edge[sta[i]].c){
flow=edge[sta[i]].c;
ebreak=i;
}
}
ans+=flow;
for(int i=0;i<top;i++){
edge[sta[i]].c-=flow;
edge[sta[i]^1].c+=flow;
}
now=edge[sta[ebreak]].u;
top=ebreak;
}
}
}
return ans;
}
void UFset(){
cnt=0;
memset(head,-1,sizeof(head));
}
void addedge(long long u,long long v,long long c){
edge[cnt].u=u;edge[cnt].v=v;edge[cnt].c=c;
edge[cnt].next=head[u];head[u]=cnt++;
edge[cnt].u=v;edge[cnt].v=u;edge[cnt].c=0;
edge[cnt].next=head[v];head[v]=cnt++;
}
bool init(){
sum=0;
long long b=0;
for(int i=1;i<=f;i++){
cin>>ox[i]>>maxx[i];
sum+=ox[i];
b+=maxx[i];
}
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
map[i][j]=inf;
for(int i=1;i<=f;i++)
map[i][i]=0;
while(p--){
long long x,y,z;
cin>>x>>y>>z;
map[x][y]=map[y][x]=map[x][y]>z?z:map[x][y];
}
if(sum>b)
return 0;
return 1;
}
void floyd(){
rr=-1;
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
for(int k=1;k<=f;k++){
if(map[i][k]!=inf&&map[j][i]!=inf&&(map[j][k]>(map[j][i]+map[i][k])||map[j][k]==inf))
map[j][k]=(map[j][i]+map[i][k]);
if(map[j][k]!=inf)
rr=map[j][k]>rr?map[j][k]:rr;
}
}
void setedge(int mid){
UFset();
for(int i=1;i<=f;i++)
addedge(0,i,ox[i]);
for(int i=1+f;i<=f*2;i++)
addedge(i,2*f+1,maxx[i-f]);
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
if(map[i][j]<=mid)
addedge(i,j+f,inf);
}
void sol(){
ll=0;
rr+=1;
long long flag=-1;
while(ll<=rr){
mid=(ll+rr)/2;
setedge(mid);
if(dinic(0,2*f+1)==sum){
flag=mid;
rr=mid-1;
}
else
ll=mid+1;
// cout<<"flag"<<flag<<" "<<"mid"<<mid<<endl;
}
cout<<flag<<endl;
}
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
while(cin>>f>>p){
if(!init()){
cout<<"-1"<<endl;
continue;
}
floyd();
sol();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator