poj2502 关于输入部分的坑。。

来源:互联网 发布:淘宝手机降价通知 编辑:程序博客网 时间:2024/06/11 05:53

这道题有两个注意点,,

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

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


0 0