【题目描述】
http://acm.hdu.edu.cn/showproblem.php?pid=1869
###【思路】
因为是任意起点和任意的中点而且数据也很小,所以用floyd比较合适。
PS1:题目有坑,编号是从0到n-1的,我习惯用1到n编号
PS2:在dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j])
松弛操作这里如果给dis数组赋的初值太大,会炸,比如我之前赋的21亿,操作时21亿+21亿,就炸了,WA了一发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include<cstdio> #include<algorithm> using namespace std; int dis[300][300]; int main() { int n,m,a,b,check; while (scanf("%d%d",&n,&m)!=EOF) { for (int i=0;i<250;i++) for (int j=0;j<250;j++) if (i==j) dis[i][j]==0; else dis[i][j]=210000000; for (int i=1;i<=m;i++) { scanf("%d%d",&a,&b); dis[a+1][b+1]=dis[b+1][a+1]=1; } for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); check=0; for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) if (dis[i][j]>7) { check=1; break; } if (check==1) break; } if (check==1) printf ("No\n"); else printf ("Yes\n"); } return 0; }
|