您的位置:首页 > 其它

HDU 4034 Graph(Floyd)

2012-06-16 10:26 387 查看
题目链接

以前练习赛中的一个题,当时没学图论,听学长说是弗洛伊德,最近学了,又重新看了一下,用的很不熟练啊。。。在WA了3 4次之后,没浮躁,很不容易。。。

题目:给你有向图的最短路,判断是否存在,存在,可以留下的最小边数。

思路:想的时间有点长,先弗洛伊德一遍,判断是图中是否存在最短路,若有则直接输出不存在,再判断图中是否存在是否有p[j][k] ==p[j][i] + p[i][k]的边,就是这里,重复计算了,WA4次,唉,开始的时候也考虑的重复计算的问题,天真的加了个break,还是不熟悉啊。。。终于发现问题后,加了个标记数组后,A了。

#include <stdio.h>
#include <string.h>
#define N  100000
int p[101][101],o[101][101];
int main()
{
int t,i,j,k,num = 0,n,sum,z;
scanf("%d",&t);
while(t--)
{
memset(o,0,sizeof(o));
z = 0;
scanf("%d",&n);
sum = n*n - n;
num ++;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
scanf("%d",&p[i][j]);
}
printf("Case %d: ",num);
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
for(k = 1; k <= n; k ++)
{
if(p[j][k] > p[j][i]+p[i][k])
{
z = 1;
break;
}
}
if(z)
printf("impossible\n");
else
{
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
for(k = 1; k <= n; k ++)
{
if(p[j][k] == p[j][i]+p[i][k]&&i != j&&i != k&&j != k&&o[j][k] == 0)
{
sum --;
o[j][k] = 1;
}
}
printf("%d\n",sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: