这道题真的是建个模型都花了我好长时间!!
最后RE了一天终于放弃用SPFA改了Djikstra参考别人的代码才过,我好气啊~~~~~~
答案明明都一样!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const double inf = 1e20;
const double eps = 1e-5;
int Next[40010],cnt,Left[40010],Right[40010];
double dict[40000],cost[400][400],dist[40000],key[40010];
bool vis[40000];
void init() {
cnt = 0;
memset(vis,false,sizeof(vis));
memset(Left,-1,sizeof(Left));
}
struct Edge{
double x,y;
} node[4001];
void add(int u,int v,double value) {
key[cnt] = value;
Next[cnt] = Left[u];
Left[u] = cnt;
Right[cnt] = v;
cnt++;
}
double Dis(Edge a,Edge b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void Dijkstra(int n,int start)
{
for(int i=1;i<=n;i++)
{
dist[i]=inf;
vis[i]=false;
}
dist[start]=0;
for(int j=0;j<n;j++)
{
int k=-1;
double Min=inf;
for(int i=1;i<=n;i++)
if(!vis[i]&&dist[i]<Min)
{
Min=dist[i];
k=i;
}
if(k==-1)break;
vis[k]=true;
for(int i=1;i<=n;i++)
if(!vis[i]&&dist[k]+cost[k][i]<dist[i])
dist[i]=dist[k]+cost[k][i];
}
}
void SPFA(int start) {
vis[start] = true;
for(int i = 0;i <= 399;i++)
dict[i] = inf;
dict[start] = 0;
queue<int> q;
while(!q.empty()) q.pop();
q.push(start);
while(!q.empty()) {
int temp = q.front();q.pop();
vis[temp] = false;
//printf("%d %d %d\n",temp,Left[temp],Next[Left[temp]]);
for(int i = Left[temp];i != -1;i = Next[i]) {
if((dict[Right[i]] - (dict[temp] + key[i]) > eps)) {
//printf("%d %.2f %.2f\n",Right[i],dict[Right[i]],dict[temp] + key[i]);
dict[Right[i]] = dict[temp] + key[i];
if(!vis[Right[i]]) {
vis[Right[i]] = true;
q.push(Right[i]);
}
}
}
}
}
int main() {
//freopen("in.txt","r",stdin);//学会了一些文件的小知识,挺好用的。
//freopen("out1.txt","w",stdout);
while(scanf("%lf%lf%lf%lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y) == 4) {
double N = 10000/60.0;
double M = 40000/60.0;
int n=2;
int cnt1=3;
int x,y;
for(int i=1;i<300;i++)
for(int j=1;j<300;j++)
{
if(i==j)cost[i][j]=0;
else cost[i][j]=inf;
}
while(scanf("%d%d",&x,&y)==2)
{
if(x==-1&&y==-1)
{
cnt1=n+1;
continue;
}
n++;
node[n].x=x;
node[n].y=y;
if(n!=cnt1)cost[n][n-1]=cost[n-1][n]=min(cost[n][n-1],Dis(node[n],node[n-1])/M);
}
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) {
cost[i][j]=min(cost[i][j],Dis(node[i],node[j])/N);
/*if(cost[i][j] != inf && cost[i][j] != 0) {
add(i,j,cost[i][j]);
//printf("%d %d %.3f\n",i,j,cost[i][j]);
}*/
}
Dijkstra(n,1);
printf("%.0f\n",(dist[2]));
}
return 0;
}