huanggang12345 2021-10-13 12:38 采纳率: 50%
浏览 32
已结题

杭电2066题,本地感觉能做了,过不了,检查不出毛病

我这个感觉本地能做了,但杭电oj过不了,有人可以看看吗,题目链接:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int dis[1010],que_top=0,que_wei=0;//dis是储存到每个城市的距离,队列的头尾
struct node* que[100000];//队列
int like[1010];//想到的城市
struct node
{
    int num;//城市编号
    int quan;//花费时间
    int vis;//访问标记
    struct node*parent;//对应表头
    struct node*next;
};
void tianjia(struct node*fp1,struct node*fp2)//添加相连的城市
{
    if(fp1->next!=NULL)
        fp2->next=fp1->next;
    fp1->next=fp2;
    fp2->parent=fp1;

}

struct node* create(int nu,int qua)//创造新节点,nu是城市标号,qua是这条路的权重
{
    struct node* new1;
    new1=(struct node*)malloc(sizeof(struct node));
    new1->num=nu;
    new1->quan=qua;
    new1->vis=0;
    new1->next=NULL;
    return new1;
};
void quepush(struct node* fp)//入队
{
    que[que_wei]=fp;
    que_wei=que_wei+1;
    if(que_wei==100000)
        que_wei=0;
}

struct node* quepop()//出队
{
    struct node* new=que[que_top];
    que_top=que_top+1;
    if(que_top==100000)
        que_top=0;
    return new;
};

void inque(struct node* fp ,struct node* vter[])//进行bfs,输入的是表头和表头的集合
{

    if(fp->next==NULL)
        return ;
//如果该城市有相连的城市,且这个城市没有被访问过,这个城市需要的时间为表头城市的时间加这个节点的权重,并把该节点对应的城市表头入队,且将该节点对应的城市表头设置为已访问过
    if(fp->next!=NULL&&vter[fp->next->num]->vis==0){
        dis[fp->next->num]=dis[fp->next->parent->num]+fp->next->quan;
        quepush(vter[fp->next->num]);
        vter[fp->next->num]->vis=1;
        inque(fp->next,vter);//搜索该表头后面还有没有其他去的城市}
//如果该城市有相连的城市,且这个城市被访问过,再计算出这条路径下这个城市需要的时间为表头城市的时间加这个节点的权重,与之前的算出的时间作比较,取小的,不再入队
    if(fp->next!=NULL&&vter[fp->next->num]->vis==1){    
        int di=dis[fp->next->parent->num]+fp->next->quan;
        if(di<dis[fp->next->num])
            dis[fp->next->num]=di;
        inque(fp->next,vter);//搜索该表头后面还有没有其他去的城市}
}
//释放表头后的节点的动态内存
void qing(struct node*fp)
{

   if(fp->next==NULL)
    return ;
   struct node*pp=fp->next->next;
   free(fp->next);
   fp->next=pp;
   qing(fp);
}
int main()
{
    struct node* vter[1010];//表头集合,也是城市
    int T,S,D,a,b,time,c;
    int top=0;//这个是喜欢城市个数,也是数组存到哪里了的标记
    int min;
    for(int i=0;i<1010;i++)
    {
        vter[i]=(struct node*)malloc(sizeof(struct node));
        vter[i]->next=NULL;
        vter[i]->num=i;
        vter[i]->vis=0;
    }//初始化表头
   while(scanf("%d %d %d",&T,&S,&D)!=EOF){
    for(int i=0;i<T;i++)
    {
        scanf("%d %d %d",&a,&b,&time);
        struct node* new1=create(b,time);
        struct node* new2=create(a,time);
        tianjia(vter[a],new1);
        tianjia(vter[b],new2);
    }//添加边,也是城市的联系
    for(int i=0;i<S;i++)
    {
        scanf("%d",&c);
        struct node* new=create(c,0);
        tianjia(vter[0],new);
    }//添加邻近城市,时间权重设为0
    for(int i=0;i<D;i++)
    {
       int e;
       scanf("%d",&e);
       like[top]=e;
       top++;
    }//喜欢城市的编号,个数

    dis[0]=0;//起点位置时间为0
    quepush(vter[0]);//将起点入队
    while(que_top!=que_wei)
    {

        struct node* curr=quepop();
        inque(curr,vter);
    }//bfs直到队列为空

    min=dis[like[0]];
    for(int i=1;i<top;i++)
    {
        if(min>dis[like[i]])
            min=dis[like[i]];
    }//找出最短时间
    printf("%d\n",min);
    //清空这组测试的数据
    for(int i=0;i<1010;i++)
        {
            dis[i]=0;
            qing(vter[i]);
            vter[i]->vis=0;
            vter[i]->next=NULL;
        }
    top=0;
    que_top=0;
    que_wei=0;
    }
    return 0;
}


  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-10-15 10:31
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了