60分求救!最后两个RE,没有用常规算法
查看原帖
60分求救!最后两个RE,没有用常规算法
928652
Owlet_code楼主2024/8/6 15:43
#include <stdio.h>

void initial(int N,int (*graph)[N+1], int (*dist)[N+1]){
  int i,j;
  for(i=0;i<=N;i++){
    for(j=0;j<=N;j++){
      graph[i][j]=0;
    }
  }
  for(i=1;i<=N;i++){
    graph[i][i]=1;
  }
  for(i=0;i<=N;i++){
    for(j=0;j<=N;j++){
      dist[i][j]=0;
    }
  }
  dist[0][1]=1;
}

void judge_connect(int row,int n,int N,int (*dist)[N+1],int graph[][N+1]){
  int i;
  int Dist[N+1],Graph[N+1];
  for(i=1;i<=N;i++){
    Dist[i]=dist[row-1][i];
    Graph[i]=graph[n][i];
  }
  for(i=1;i<=N;i++){
    if(dist[row-1][i]>0){
      dist[row][i]=dist[row-1][i];
      continue;
    }
    if(graph[n][i]>0){
      dist[row][i]+=dist[row-1][n]*graph[n][i];
        dist[row][i]%=100003;
    }
  }
}


int main(void) {
  int N, M;
  scanf("%d %d",&N, &M);
  int graph[N+1][N+1];
  int dist[N+1][N+1];
  int i, j;
  int x,y;
  initial(N, graph, dist);
  for(i=1; i<=M; i++){
    scanf("%d %d", &x, &y);
    if(x!=y){
      graph[x][y]++;
      graph[y][x]++;
    } 
  }
  for(i=1;i<=N;i++){
    for(j=1;j<=N;j++){
      if(dist[i-1][j]!=0){
        judge_connect(i, j, N, dist, graph);
      }
    }
  }
  for(i=1;i<=N;i++){
    printf("%d\n",dist[N][i]%100003);
  }
  return 0;
}

/*
图结构
  邻接矩阵
  
输入
  顶点数N, 边数M
  共M行(连接顶点x和顶点y的边)
    顶点x, 顶点y

输出
  共N行
  从1到i的最短路个数

主函数
  输入N和M
  (创建图)
  for循环M次
    输入顶点x和y
    在邻接矩阵(x,y)和(y,x)处加1
  (最短路计数)
  (先看顶点1与其他点是否联通,联通的则在路径计数上记上联通通路的个数
    对于已联通的点,更新一下与他们相连的点,如果有新的点则在记录联通通路的数组上记上原来的点的联通通路个数乘新的联通通路个数)
    for循环从1直到N
      for循环从1到N
        如果最短路径数[i]有值
          联通判断(i)

无 初始化最短路径数组(数组指针)
  最短路径数[1]=1
  for循环从2到N
    最短路径数[i]=0
    
无 联通判断(顶点)
  for循环从2到N
    如果最短路径数[i]有值
      continue
    如果邻接矩阵[顶点][i]值大于0
      最短路径数[i]=最短路径数[顶点]*邻接矩阵显示的边数
*/
2024/8/6 15:43
加载中...