Hud 1869 六度分离[基础最短路floyd]

来源:互联网 发布:投资理财源码下载 编辑:程序博客网 时间:2024/05/19 07:42

题目连接:点击打开链接

题目意思很是简单,每对互相认识权值为1就是了。

WA了很多次,附WA带代码。

#include<cstdio>#include<cstring>#define INF 0xffffff#define min(a,b) a>b?b:aconst int N=105;int dp[N][N];int n,m;void Init(){    for(int i=0;i<n;i++)    for(int j=0;j<n;j++)    {        if(j==i) dp[i][j]=0;        else dp[i][j]=INF;    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        Init();        int i,j,k;        for(i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            if(a!=b)            {                dp[a][b]=1;                dp[b][a]=1;            }        }        for(k=0;k<n;k++)        for(i=0;i<n;i++)        for(j=0;j<n;j++)        dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            if(dp[i][j]>7) break;            if(dp[i][j]>7) break;        }        if(i==n&&j==n) printf("Yes\n");        else printf("No\n");    }    return 0;}
很是不理解为什么会错,后来,我换了一种判断成立的方法就AC了,有很是郁闷,判断的时候为什么会错。

后来了就想到了第二个跳出循环的break回出错,因为每次的j都会为n,而dp[i][n]肯定大于7。我换了一种判断方法避免了出现这种情况,所以就AC了。

代码:

#include<cstdio>#include<cstring>#define INF 0xffffff#define min(a,b) a>b?b:aconst int N=105;int dp[N][N];int n,m;void Init(){    for(int i=0;i<n;i++)    for(int j=0;j<n;j++)    {        if(j==i) dp[i][j]=0;        else dp[i][j]=INF;    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        Init();        int i,j,k;        for(i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            if(a!=b)            {                dp[a][b]=1;                dp[b][a]=1;            }        }        for(k=0;k<n;k++)        for(i=0;i<n;i++)        for(j=0;j<n;j++)        dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);        bool flag=false;        for(i=0;i<n;i++)        for(j=0;j<n;j++)        if(dp[i][j]>7) flag=true;        if(!flag) printf("Yes\n");        else printf("No\n");    }    return 0;}//AC again#include<cstdio>#include<cstring>#define INF 0xffffff#define min(a,b) a>b?b:aconst int N=105;int dp[N][N];int n,m;void Init(){    for(int i=0;i<n;i++)    for(int j=0;j<n;j++)    {        if(j==i) dp[i][j]=0;        else dp[i][j]=INF;    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        Init();        int i,j,k;        for(i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            if(a!=b)            {                dp[a][b]=1;                dp[b][a]=1;            }        }        for(k=0;k<n;k++)        for(i=0;i<n;i++)        for(j=0;j<n;j++)        dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            if(dp[i][j]>7) break;            if(dp[i][j]>7&&j!=n) break;        }        if(i==n&&j==n) printf("Yes\n");        else printf("No\n");    }    return 0;}
最短路,慢慢来。come on!加油!

原创粉丝点击