首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

PAT1003有个测试点过不去,多谢

2013-03-01 
PAT1003有个测试点过不去,谢谢#includestdio.h#includelimits.h#define maxsize 1000int E[maxsize][m

PAT1003有个测试点过不去,谢谢

#include<stdio.h>
#include<limits.h>
#define maxsize 1000
int E[maxsize][maxsize];
int visited[maxsize];
int shortest[maxsize][2];
int maxteam[maxsize];
int team[maxsize];
int main()
{
  int n,m,me,save,i,j,c1,c2,L,min,fmin;
  scanf("%d %d %d %d",&n,&m,&me,&save);
  for(i=0;i<n;i++)
    scanf("%d",&team[i]);
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
      E[i][j]=INT_MAX;
  for(i=0;i<m;i++)
  {
    scanf("%d %d %d",&c1,&c2,&L);
    if(E[c1][c2]>L)
      E[c1][c2]=L;
    E[c2][c1]=E[c1][c2];
  }
  for(i=0;i<n;i++)
  {
    visited[i]=0;
    maxteam[i]=0;
    shortest[i][0]=INT_MAX;
    shortest[i][1]=0;
  }
  visited[me]=1;
  maxteam[me]=team[me];
  shortest[me][0]=0;
  shortest[me][1]=1;
  i=me;
  while(i!=save)
  {
    for(j=0;j<n;j++)
    {
      if(E[i][j]!=INT_MAX&&visited[j]==0)
      {
        if(shortest[i][0]+E[i][j]<shortest[j][0])
        {
          shortest[j][0]=shortest[i][0]+E[i][j];
          shortest[j][1]=shortest[i][1];
          maxteam[j]=maxteam[i]+team[j];
        }
        else
          if(shortest[i][0]+E[i][j]==shortest[j][0])
          {
            shortest[j][1]++;
            if(maxteam[i]+team[j]>maxteam[j])
              maxteam[j]=maxteam[i]+team[j];
          }
      }
    }
    min=INT_MAX;
    fmin=-1;
    for(j=0;j<n;j++)
    {
      if(visited[j]==0&&shortest[j][0]<min)
      {
        min=shortest[j][0];
        fmin=j;
      }
    }
    if(fmin==-1)
      break;
    visited[fmin]=1;
    i=fmin;
  }
  if(shortest[save][1]==0)
    printf("1 %d\n",team[save]);
  else
    printf("%d %d\n",shortest[save][1],maxteam[save]);


  return 0;
}

PAT ACM 最短路径 c 测试
[解决办法]
代码写的太narrow了
加注释才能看
初步观测 你确定你写的是prim么。。

热点排行