比赛 |
20150422 |
评测结果 |
AWWWTEEEEEE |
题目名称 |
背驮式行走 |
最终得分 |
9 |
用户昵称 |
一個人的雨 |
运行时间 |
2.886 s |
代码语言 |
C++ |
内存使用 |
191.49 MiB |
提交时间 |
2015-04-22 11:39:17 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int a[5000][5000];
int b[5000][4999];
long long cost=0,cost1=0;
int pd1,pd2,pd3;
int dis1[40000],dis2[40000],dis[40000];
int e,p,n,m,bbb;
int Tbfs(int x,int y){
queue<int>q1;//B
queue<int>q2;//E
q1.push(x);
q2.push(y);
memset(dis1,0x7f,sizeof(dis1));
memset(dis2,0x7f,sizeof(dis2));
bool f1[40000]={0};
bool f2[40000]={0};
f1[x]=1;
f2[y]=1;
dis1[x]=dis2[y]=0;
while (!q1.empty()&&!q2.empty())
{
int k=q1.front();
int o=q2.front();
for (int i=1;i<=b[k][0];++i)
if (a[k][b[k][i]]==1&&(!f1[b[k][i]]||dis1[k]+1<dis1[b[k][i]]))
{
dis1[b[k][i]]=dis1[k]+1;
if (!f1[b[k][i]])
{
q1.push(b[k][i]);
f1[b[k][i]]=1;
}
if (f2[b[k][i]]==1)
return b[k][i];
}
q1.pop();
for (int i=1;i<=b[o][0];++i)
if (a[o][b[o][i]]==1&&(!f2[b[o][i]]||dis2[o]+1<dis2[b[o][i]]))
{
dis2[b[o][i]]=dis2[o]+1;
if (!f2[b[o][i]])
{
q2.push(b[o][i]);
f2[b[o][i]]=1;
}
if (f1[b[o][i]]==1)
return b[o][i];
}
q2.pop();
}
return -1;
}
void spfa(int x){
bool f[40000]={0};
memset(dis,0x7f,sizeof(dis));
queue<int> q;
dis[x]=0;
q.push(x);
f[x]=1;
while(!q.empty())
{
int k=q.front();
for(int i=1;i<=b[k][0];i++)
{
if(a[k][b[k][i]]==1&&dis[b[k][i]]>dis[k]+1)
{
dis[b[k][i]]=dis[k]+1;
if(!f[b[k][i]])
{
q.push(b[k][i]);
f[b[k][i]]=1;
}
}
}
f[k]=0;
q.pop();
}
}
int main()
{
freopen("piggyback.in","r",stdin);
freopen("piggyback.out","w",stdout);
scanf("%d%d%d%d%d",&bbb,&e,&p,&n,&m);
int x,y;
memset(a,0,sizeof(a));
for (int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
a[x][y]=1;
//a[y][x]=1;
b[x][++b[x][0]]=y;
//b[y][++b[y][0]]=x;
}
if (p<bbb+e) {
pd1=Tbfs(1,2);
if (pd1!=-1)
{
//cout<<dis1[pd1]<<" "<<dis2[pd1]<<" ";
cost1=dis1[pd1]*bbb+dis2[pd1]*e;
//cout<<cost1<<" ";
spfa(pd1);
cost1+=dis[n]*p;
//cout<<pd1<<" ";
}
else cost=0x7ffffffff;
}
spfa(1);
cost=0;
cost+=dis[n]*bbb;
spfa(2);
cost+=dis[n]*e;
//cout<<cost<<" ";
if (cost<cost1) cout<<cost;
else cout<<cost1;
return 0;
}