hdu4034floyd加深理解

来源:互联网 发布:同花顺配资软件 编辑:程序博客网 时间:2024/02/24 08:24

 以给的最短距离为边建图,然后利用floyd算所有点之间的距离,
如果i到j的距离经过k则标记i到j,
最后如果i到j被标记了并且求的的最短距离等于原始的(即直连的)
则可以把直连的删除即总边数减一。
如果求的的距离小于直连标记 输出impossible

#include<iostream>#include<cstdlib>#include<stdio.h>#include<memory.h>using namespace std;int map[110][110];int visit[110][110];int n;int dist[110][110];void floyd() {        int i,j,k;            for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            for(k=1;k<=n;k++)            {                if(j!=i&&i!=k&&dist[j][k]>=dist[j][i]+dist[i][k])                {                    visit[j][k]=1;                    dist[j][k]=dist[j][i]+dist[i][k];                    }                    }                    }int main(){    int t;    int count=1;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(map,0,sizeof(map));        memset(dist,0,sizeof(dist));        for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        {scanf("%d",&dist[i][j]);         map[i][j]=dist[i][j];}         memset(visit,0,sizeof(visit));         floyd();         int ans=0;         bool flag=true;         for(int i=1;i<=n;i++)         for(int j=1;j<=n;j++)         {            if(visit[i][j]==1&&dist[i][j]==map[i][j])            {                ans++;            }            if(dist[i][j]<map[i][j])            {                flag=false;            }         }         int m=n*(n-1)-ans;         if(!flag||m<n-1)         printf("Case %d: impossible\n",count++);         else        printf("Case %d: %d\n",count++,m)    }}


 

原创粉丝点击