| ||||||||||
| 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 | |||||||||
优化到900多MS,不知道该怎么继续优化了。。#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stdio.h>
#include<map>
using namespace std;
long long ans;
int n,m,k,t;
int adj[3][111][501],num[111],MOD;
int radj[3][111][501],rnum[111];
int queue[1000000][2],dp[101][3001];
bool visit[111][3001];
struct pp
{
int x,y,g,num;
long long d;
bool operator <(const pp &temp) const
{
if(d+(long long)g==temp.d+(long long)temp.g)
return num<temp.num;
return d+(long long)g<temp.d+(long long)temp.g;
}
};
map <pp,bool> hash;
map <pp,bool>:: iterator it;
pp u,nw,now;
int cnt;
int lcm(int x,int y)
{
int res=x*y,temp;
while(x%y)
{
temp=x%y;
x=y;
y=temp;
}
res/=y;
return res;
}
void SPFA()
{
int i,j,s,tv,cc,v,id,temp1,temp2,temp,gc,value;
for(i=0;i<n;i++)
for(j=0;j<MOD;j++)
{
dp[i][j]=1000000000;
visit[i][j]=false;
}
temp=0;
for(i=0;i<MOD;i++)
{
if(visit[n-1][i]==false)
{
visit[n-1][i]=true;
queue[temp][0]=n-1;
queue[temp++][1]=i;
dp[n-1][i]=0;
}
}
temp1=0;
temp2=temp-1;
while(temp1<=temp2)
{
for(i=temp1;i<=temp2;i++)
{
visit[queue[i][0]][queue[i][1]]=false;
for(j=0;j<rnum[queue[i][0]];j++)
{
id=radj[0][queue[i][0]][j];
v=radj[1][queue[i][0]][j];
cc=radj[2][queue[i][0]][j];
if((queue[i][1]-v)%cc!=0)
continue;
value=((queue[i][1]-v)%MOD+MOD)%MOD;
int smin,smax;
for(s=max(max(value-t,0),value-cc+1);s<=value;s++)
{
if(((queue[i][1]-v-s)%MOD+MOD)%MOD<=t&&dp[id][s]>dp[queue[i][0]][queue[i][1]]+v+((queue[i][1]-v-s)%MOD+MOD)%MOD)
{
dp[id][s]=dp[queue[i][0]][queue[i][1]]+v+((queue[i][1]-v-s)%MOD+MOD)%MOD;
if(visit[id][s]==false)
{
visit[id][s]=true;
queue[temp][0]=id;
queue[temp++][1]=s;
}
}
}
for(s=max(max(value+1,MOD+value-t),MOD+value-cc+1);s<MOD;s++)
{
if(((queue[i][1]-v-s)%MOD+MOD)%MOD<=t&&dp[id][s]>dp[queue[i][0]][queue[i][1]]+v+((queue[i][1]-v-s)%MOD+MOD)%MOD)
{
dp[id][s]=dp[queue[i][0]][queue[i][1]]+v+((queue[i][1]-v-s)%MOD+MOD)%MOD;
if(visit[id][s]==false)
{
visit[id][s]=true;
queue[temp][0]=id;
queue[temp++][1]=s;
}
}
}
}
}
temp1=temp2+1;
temp2=temp-1;
}
}
long long kth()
{
int id,i,j,cc;
u.x=0;
u.y=0;
u.d=0;
u.g=dp[0][0];
hash[u];
while(true)
{
if(hash.size()==0)
return -1;
u=hash.begin()->first;
hash.erase(u);
if(u.g>=1000000000)
return -1;
if(u.x==n-1)
{
k--;
if(k==0)
return u.d;
}
for(i=0;i<num[u.x];i++)
{
cc=adj[2][u.x][i];
now.d=(long long)1000000000*(long long)1000000000;
now.g=1000000000;
int jmin=(u.y-1)/cc+1;
if(u.y==0)
jmin=0;
int cont=0;
for(j=jmin;j<=jmin+MOD/cc-1;j++)
{
if(((j*cc-u.y)%MOD+MOD)%MOD<=t)
{
cont++;
id=adj[0][u.x][i];
nw.x=id;
nw.d=u.d+(long long)adj[1][u.x][i]+(long long)((j*cc-u.y)%MOD+MOD)%MOD;
nw.y=nw.d%MOD;
nw.g=dp[id][nw.y];
if(nw.g<1000000000)
{
nw.num=1000000000;
if(hash.size()==0)
{
nw.num=1;
hash[nw];
}
else
{
it=hash.upper_bound(nw);
if(it==hash.begin())
{
nw.num=1;
hash[nw];
}
else
{
it--;
if(nw.d+nw.g==it->first.d+it->first.g)
nw.num=it->first.num+1;
else
nw.num=1;
hash[nw];
}
}
if(hash.size()>k)
{
it=hash.end();
it--;
hash.erase(it);
}
if(hash.size()==k)
{
it=hash.end();
it--;
if(it->first.d+it->first.g<=nw.d+nw.g)
break;
}
}
}
else
{
int kp;
if(j*cc<u.y)
kp=(j*cc-u.y)/MOD-((j*cc-u.y)%MOD!=0);
else
kp=(j*cc-u.y)/MOD;
j=((kp+1)*MOD+u.y-1)/cc+1;
}
}
}
}
}
int main()
{
int id1,id2,w,c,i,j,tst=0,ax;
while(scanf("%d%d%d%d",&n,&m,&k,&t)&&n>0)
{
tst++;
memset(num,0,sizeof(num));
memset(rnum,0,sizeof(rnum));
hash.clear();
k++;
MOD=1;
ax=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&id1,&id2,&c,&w);
MOD=lcm(MOD,c);
adj[0][id1][num[id1]]=id2;
adj[1][id1][num[id1]]=w;
adj[2][id1][num[id1]++]=c;
if(ax<c)
ax=c;
radj[0][id2][rnum[id2]]=id1;
radj[1][id2][rnum[id2]]=w;
radj[2][id2][rnum[id2]++]=c;
}
SPFA();
ans=kth();
while(ans<-1)
puts("orz");
printf("Case %d: %I64d\n",tst,ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator