您的位置:首页 > 其它

Funny Car Racing UVA - 12661 (当初就不该浪的最短路)

2017-07-27 20:00 441 查看
比赛题目,当时其实按照我的做法去写就写出来了,可是由于不该浪的时候在浪,所以就把自己的结论给推翻了,这么多人没做出来以为这道题很难,其实是简单*********

最短路的dis数组记录的当前最短路,也就是当前的时间,根据当前的时间你可以去确定从这点出发到联通路的数值,这不就是一个裸的最短路啊。只需要在更新的时候判断一下权值就可以了啊。哎,辛亏是平时训练赛,区域赛一定不能这样。

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
const int M=400+10;
int pre[M],vis[M],cnt,kase=1;
long long dis[M];
struct aa
{
int u,v,w,next,a,b;
} edge[50086];
void add(int u,int v,int a,int b,int w)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].a=a;
edge[cnt].b=b;
edge[cnt].next=pre[u];
pre[u]=cnt++;
}
void spfa(int s,int e)
{
queue<int>ycq;
dis[s]=0;
vis[s]=1;
ycq.push(s);
while(!ycq.empty())
{
int u=ycq.front();
ycq.pop();
vis[u]=0;
for(int i=pre[u]; i!=-1; i=edge[i].next)
{
int v=edge[i].v;
int w=edge[i].w;
int a=edge[i].a;
int b=edge[i].b;
int p=dis[u]%(a+b);

if(p<=a)//处于开区间内
{
if(a-p<w)//可以过得去
{
w=w+a+b-p;
}
}
else//
{
w=w+a+b-p;
}
//printf("%d %d %d\n",u,v,w);
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
if(!vis[v])
{
vis[v]=1;
ycq.push(v);
}
}
}
}
printf("Case %d: %lld\n",kase++,dis[e]);
}
int main()
{
int n,m,s,t;
while(scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF)
{
cnt=0;
for(int i=0; i<=n; i++)
{
vis[i]=0;
dis[i]=99999999999999999;
pre[i]=-1;
}
int u,v,a,b,w;
for(int i=0; i<m; i++)
{
scanf("%d%d%d%d%d",&u,&v,&a,&b,&w);
if(a>=w)
{
add(u,v,a,b,w);
}
}
spfa(s,t);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: