比赛 |
咲 -Saki- 互测赛 |
评测结果 |
PE |
题目名称 |
一起进军全国吧 |
最终得分 |
37 |
用户昵称 |
苏轼 |
运行时间 |
0.096 s |
代码语言 |
C++ |
内存使用 |
0.33 MiB |
提交时间 |
2012-07-19 11:38:51 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
string w[500];
string wen[500];
int number,sc=1;
vector<int>a[500];
vector<double>b[500];
double ans[500]={0};
bool used[500]={0};
void spfa();
int main()
{
freopen ("zengokuhe.in","r",stdin);
freopen ("zengokuhe.out","w",stdout);
cin>>number>>w[0];
for (int i=0;i<number;i++)
{
cin>>wen[i];
}
scanf("\n");
char q[1000];
int ji=0;
double qnum=0;
while (gets(q))
{
int lq,tou;
lq=strlen(q);
if (q[0]=='S'&&q[1]==' ')
{
ji=0;
continue;
}
if (q[0]>='0'&&q[0]<='9')
{
int i=0,u=0;
double num1=0,num2=0,num=0;
while (q[i]!=' '&&i<lq)
{
if (q[i]=='.')
{
u=1;
i++;
continue;
}
if (u==0)
{
num1*=10;
num1+=(q[i]-'0');
i++;
continue;
}
if (u==1)
{
num2+=(q[i]-'0');
num2/=10;
i++;
continue;
}
}
num=num1+num2;
string str;
i++;
while (q[i]!=' '&&i<lq)
{
str+=q[i];
i++;
}
bool use=0;
for (int j=0;j<sc;j++)
{
if (str==w[j])
{
if (ji==0)
{
tou=j;
qnum=0;
}
else
{
a[tou].push_back(j);
b[tou].push_back(num-qnum);
a[j].push_back(tou);
b[j].push_back(num-qnum);
qnum=num;
tou=j;
}
use=1;
break;
}
}
if (!use)
{
if (ji==0)
{
tou=sc;
qnum=0;
}
else
{
a[tou].push_back(sc);
b[tou].push_back(num-qnum);
a[sc].push_back(tou);
b[sc].push_back(num-qnum);
qnum=num;
tou=sc;
}
w[sc]=str;
sc++;
}
}
else
{
int i=0,u=0;
double num1=0,num2=0,num=0;
string str;
while (q[i]!=' '&&i<lq)
{
str+=q[i];
i++;
}
i++;
while (q[i]!=' '&&i<lq)
{
if (q[i]=='.')
{
u=1;
i++;
continue;
}
if (u==0)
{
num1*=10;
num1+=(q[i]-'0');
i++;
continue;
}
if (u==1)
{
num2+=(q[i]-'0');
num2/=10;
i++;
continue;
}
}
num=num1+num2;
bool use=0;
for (int j=0;j<sc;j++)
{
if (str==w[j])
{
if (ji==0)
{
tou=j;
qnum=0;
}
else
{
a[tou].push_back(j);
b[tou].push_back(num-qnum);
a[j].push_back(tou);
b[j].push_back(num-qnum);
qnum=num;
tou=j;
}
use=1;
break;
}
}
if (!use)
{
if (ji==0)
{
tou=sc;
qnum=0;
}
else
{
a[tou].push_back(sc);
b[tou].push_back(num-qnum);
a[sc].push_back(tou);
b[sc].push_back(num-qnum);
qnum=num;
tou=sc;
}
w[sc]=str;
sc++;
}
}
ji++;
}
/*for (int i=0;i<sc;i++)
{
cout<<w[i]<<endl;
for (int j=0;j<a[i].size();j++)
{
cout<<w[a[i][j]]<<' '<<b[i][j]<<endl;
}
}*/
spfa();
for (int i=0;i<number;i++)
{
int ue=0;
for (int j=0;j<sc;j++)
{
if (wen[i]==w[j])
{
ue=1;
printf("%.2lf\n",ans[j]);
break;
}
}
if (!ue)
{
cout<<"-1.00"<<endl;
}
}
return 0;
}
void spfa()
{
for (int i=0;i<sc;i++)
{
ans[i]=100000000;
}
int tou=0,wei=0;
int na[1000];
na[tou]=0;
ans[tou]=0;
used[0]=1;
while (tou<=wei)
{
for (int i=0;i<a[na[tou]].size();i++)
{
int j;
j=a[na[tou]][i];
if (ans[j]>ans[na[tou]]+b[na[tou]][i]&&!used[j])
{
wei++;
na[wei]=j;
ans[j]=ans[na[tou]]+b[na[tou]][i];
used[j]=1;
}
if (ans[j]>ans[na[tou]]+b[na[tou]][i]&&used[j])
{
ans[j]=ans[na[tou]]+b[na[tou]][i];
}
}
tou++;
}
}