hdu 2145 (排序+dij)

来源:互联网 发布:软件源代码管理流程图 编辑:程序博客网 时间:2024/06/11 20:50

点击打开链接


WA了好几次。。。

还是没想明白。。

WA代码,,下面有aC的代码

#include"stdio.h"#include"string.h"#include"stdlib.h"#define inf 1000000int n,m;int map[330][330];int f[330],mark[330];int end;struct node{int num;int dis;int speed;int pos;double time;}A[330];int cmp(const void*a,const void*b){struct node *c,*d;c=(struct node*)a;d=(struct node*)b;if(c->time!=d->time)return c->time>d->time;else if(c->dis!=d->dis)return d->dis-c->dis;else return d->num-c->num;}int main(){int k;int i,j;int a,b,c;while(scanf("%d%d%d",&n,&m,&k)!=-1){for(i=0;i<=n;i++){for(j=0;j<=n;j++){if(i==j)map[i][i]=0;else map[i][j]=inf;}}for(i=0;i<k;i++){scanf("%d%d%d",&a,&b,&c);if(c<map[b][a])map[b][a]=c;}scanf("%d",&end);for(i=1;i<=m;i++)scanf("%d",&A[i].pos);for(i=1;i<=m;i++){A[i].num=i;scanf("%d",&A[i].speed);}int min;memset(mark,0,sizeof(mark));for(i=1;i<=n;i++)f[i]=map[end][i];f[end]=0;for(i=1;i<n;i++){min=inf;k=-1;for(j=1;j<=n;j++){if(!mark[j]&&f[j]<min){min=f[j];k=j;}}if(k==-1)break;mark[k]=1;for(j=1;j<=n;j++){if(!mark[j]&&f[j]>f[k]+map[k][j])f[j]=map[k][j]+f[k];}}for(i=1;i<=m;i++){A[i].dis=f[A[i].pos];A[i].time=A[i].dis*1.0/A[i].speed;}for(i=1;i<=m;i++){if(A[i].dis<inf)break;}if(i==m+1)printf("No one\n");else{A[0].time=inf;A[0].dis=0;A[0].num=0;qsort(A,m+1,sizeof(A[0]),cmp);printf("%d\n",A[0].num);}}return 0;}


AC代码

#include"stdio.h"#include"string.h"#include"stdlib.h"#include"algorithm"#define inf 1000000using namespace std;struct node{    int speed;    int pos;    int dist;    int num;    double cost;}A[510];int n,m,k;int end;int map[510][510],v[510],dis[510];bool cmp(node a,node b){    if(a.cost!=b.cost)return a.cost<b.cost;    else if(a.dist!=b.dist) return a.dist>b.dist;    else return a.num>b.num;}int main(){    int f,min;    int a,b,c;    int i,j;    while(scanf("%d%d%d",&n,&m,&k)!=-1)    {        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                if(i==j)map[i][j]=0;                else map[i][j]=inf;            }        }        for(i=0;i<k;i++)        {            scanf("%d%d%d",&a,&b,&c);            if(c<map[b][a])map[b][a]=c;        }        scanf("%d",&end);        for(i=1;i<=n;i++)            dis[i]=map[end][i];        for(i=1;i<=m;i++)        {            A[i].num=i;            scanf("%d",&A[i].pos);        }        for(i=1;i<=m;i++)            scanf("%d",&A[i].speed);        memset(v,0,sizeof(v));        for(i=1;i<n;i++)        {            min=inf;            f=-1;            for(j=1;j<=n;j++)            {                if(!v[j]&&dis[j]<min)                {                    min=dis[j];                    f=j;                }            }            if(f==-1)break;            v[f]=1;            for(j=1;j<=n;j++)            {                if(!v[j]&&dis[j]>dis[f]+map[f][j])                    dis[j]=dis[f]+map[f][j];            }        }        for(i=1;i<=m;i++)        {            A[i].dist=dis[A[i].pos];            A[i].cost=1.0*A[i].dist/A[i].speed;        }        int mind=inf;        for(i=1;i<=m;i++)        {            if(A[i].dist<mind)            {                mind=A[i].dist;                break;            }        }        if(mind!=inf)        {            sort(A+1,A+m+1,cmp);            printf("%d\n",A[1].num);        }        else printf("No one\n");    }    return 0;}