考查点:最短路径
提交情况:1次WA
收获:学会了Floyd算法,用于求所有点之间的最短路径
AC_CODE:
- #include <stdio.h>
- #define MAX 101
- int A[MAX][MAX],edges[MAX][MAX],B[MAX];
- void floyd(int n)
- {
- for(int i=0;i<n;i++)
- for(int j=0;j<n;j++)
- A[i][j]=edges[i][j];
- for(int k=0;k<n;k++)
- for(int i=0;i<n;i++)
- for(int j=0;j<n;j++)
- if(A[i][k]+A[k][j]<A[i][j])
- A[i][j]=A[i][k]+A[k][j];
- }
- int main()
- {
- int num,paris,v,cost,sum,minv,min,totalcost;
- while(scanf("%d",&num))
- {
- if(num==0) break;
- for(int i=0;i<num;i++)
- for(int j=0;j<num;j++)
- {
- if(i==j)
- edges[i][j]=0;
- else
- edges[i][j]=999999;
- }
- for(int i=0;i<num;i++)
- {
- scanf("%d",&paris);
- for(int j=0;j<paris;j++)
- {
- scanf("%d%d",&v,&cost);
- edges[i][v-1]=cost;
- }
- }
- floyd(num);
- min=100000;
- for(int i=0;i<num;i++)
- {
- sum=0;
- for(int j=0;j<num;j++)
- sum+=A[i][j];
- if(sum<min)
- {
- min=sum;
- minv=i;
- }
- }
- totalcost=0;
- for(int i=0;i<num;i++)
- if(A[minv][i]>totalcost)
- totalcost=A[minv][i];
- if(totalcost>999999)
- printf("disjoint/n");//注意别忘了~WA可能就是因为没有加这句~
- else
- printf("%d %d/n",minv+1,totalcost);//又忘了/n!!! 晕了~
- }
- return 0;
- }
排名:12085
突然想也把排名记在这里吧,记录一下走过的足迹~可惜前面的没记~每当看到排名前一点都挺高兴的~呵呵。其实现在因为排名太后了,所以每提交一个题都会进很多的名次~
第一个最短路径问题,是Floyd算法,edges[i][j]初始化时,对角线元素都为0,而没有路径的为无穷大。Floyd算法的时间复杂度为O(n3),其实在写的时候,一直都在想会不会很慢,会超时,可是结果时间是0MS~奇怪~当然了,也有可能是OJ的时候测试数据比较少~不过以后再用O(n3)的算法时就不会太担心了~呵呵。