poj2502 关于输入部分的坑。。

这道题有两个注意点,,

第一就是输入, ,关键就是输入,, 所以我放入模板记忆中。。

第二就是我还是经常犯的错误吧。。。就是如果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();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值