正文

Zju 1082 Stockbroker Grapevine2006-08-12 20:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17523.html

分享到:

2017811 2006-08-12 20:23:54 Accepted 1082 C++ 00:00.00 428K St.Crux 最短路径的前提就是i点到k点能够访问。反之就是访问不能。 W.Floyd把j放在外面,i,k放在循环里面。我曾经错误的认为i和k是应该在外层循环,结果造成了长期的心理错觉,以致于一遇见这样的题目就ac不能,进而对Floyd先生产生了强烈的怨念。但是Floyd有证明么? #include <cstdio>#include <string> #define MX 1001 int a[100][100], n, m; int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &n) && n) {  int i, k, j, ac = 1;  for(i = 0; i < n; i ++)  {   scanf("%d", &m);   for(k = 0; k < n; k ++)   {    a[i][k] = MX;   }   for(k = 0; k < m; k ++)   {    int ti, tn;    scanf("%d %d", &ti, &tn);    a[i][ti - 1] = tn;   }  }  //pa();  for(j = 0; j < n; j ++)  {   for(i = 0; i < n; i ++)   {    for(k = 0; k < n; k ++)    {       if(i == k || i == j || j == k) continue;     if(a[i][j] + a[j][k] < a[i][k])      a[i][k] = a[i][j] + a[j][k];    }   }  }  //pa();  int ans = MX, num;  for(i = 0; i < n; i ++)  {   int mx = 0;   for(k = 0; k < n; k ++)   {    if(i == k) continue;    if(a[i][k] > mx)     mx = a[i][k];   }   if(mx < ans)   {    ans = mx;    num = i + 1;   }  }  if(ans == MX)   printf("disjoint\n");  else   printf("%d %d\n", num, ans); } return 0;}

阅读(4283) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册