这道题有两个注意点,,
第一就是输入, ,关键就是输入,, 所以我放入模板记忆中。。
第二就是我还是经常犯的错误吧。。。就是如果dIst是double的话,,我应该要用for(赋值,而不是用mem赋值为inf
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1e9
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
const int maxn=305;
struct Node{
double x,y;
}node[maxn];
double cost[maxn][maxn];
double dis(Node a,Node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dist[maxn];
int vis[maxn];
void djk(int n){
for(int i=1;i<=n;i++)
{
dist[i]=INF;
vis[i]=false;
}/*
mem(dist,inf);
mem(vis,0);*/
dist[1]=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]=1;
for(int i=1;i<=n;++i){
if(!vis[i]&&dist[k]+cost[k][i]<dist[i])
dist[i]=dist[k]+cost[k][i];
}
}
}
int main(){
double v1=10000.0/60;
double v2=40000.0/60;
while(~sf("%lf%lf%lf%lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y)){
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])/v2);
}
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])/v1);
}
} //只有相邻的站点能到
djk(n);
pf("%.0lf\n",(dist[2]));
}
}
下面是再敲的。自己的输入还是不太会,然而当我用spfa的时候确实wa、、、
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1e9
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
double v1=10000.0/60;
double v2=40000.0/60;
const int maxn=205;
double cost[maxn][maxn];
int n;
struct Node{
double x,y;
}node[maxn];
double d[maxn];
double dis(Node a,Node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int vis[maxn];
/*
void spfa(){
queue<int>q;
for(int i=1;i<=maxn;++i){
d[i]=INF;
}
mem(vis,0);
q.push(0);
vis[0]=1;
d[0]=0;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=0;i<=n;++i){
int v=i;
if(d[v]>d[u]+cost[u][v]){
d[v]=d[u]+cost[u][v];
if(!vis[v]){
vis[v]=1;q.push(v);
}
}
}
}
pf("%.0lf\n",d[1]);
}
*/
void djk(int n){
for(int i=0;i<=n;i++)
{
d[i]=INF;
vis[i]=false;
}/*
mem(d,inf);
mem(vis,0);*/
d[0]=0;
for(int j=0;j<n;++j){
int k=-1;
double Min=INF;
for(int i=0;i<=n;++i){
if(!vis[i]&&d[i]<Min){
Min=d[i];k=i;
}
}
if(k==-1)break;
vis[k]=1;
for(int i=0;i<=n;++i){
if(!vis[i]&&d[k]+cost[k][i]<d[i])
d[i]=d[k]+cost[k][i];
}
}
pf("%.0lf\n",d[1]);
}
int main(){
double sx,sy,ex,ey;
while(~sf("%lf%lf%lf%lf",&sx,&sy,&ex,&ey)){
node[0].x=sx;node[0].y=sy;node[1].x=ex;node[1].y=ey;
for(int i=0;i<maxn;++i){
for(int j=0;j<maxn;++j){
if(i==j)cost[i][j]=0;
cost[i][j]=INF;
}
}
n=1;
double x,y;
/*
while(~sf("%lf%lf",&x,&y)){
if(x==-1&&y==-1){
cnt=n+2;
continue;
}
node[++n].x=x;node[n].y=y;
if(n==cnt){
cnt++;
cost[n-1][n]=cost[n][n-1]=dis(node[n-1],node[n])/v2;
}
}*/
int cnt1=n+1;
while(scanf("%lf%lf",&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])/v2);
}//这个地方的输入还是要学学啊。。。
for(int i=0;i<=n;++i){
for(int j=0;j<=n;++j){
if(i==j)continue;
cost[i][j]=min(cost[i][j],dis(node[i],node[j])/v1);
}
}
djk(n);
//spfa();
}
}
1万+

被折叠的 条评论
为什么被折叠?



