首页 > 代码库 > HDU 4034 Graph(floyd,最短路,简单)

HDU 4034 Graph(floyd,最短路,简单)

题目

 

一道简单的倒着的floyd。

具体可看代码,代码可简化,你有兴趣可以简化一下,就是把那个Dijsktra所实现的功能放到倒着的floyd里面去。

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;



const int MAXN=110;  
const int INF=0x3f3f3f3f;//防止后面溢出,这个不能太大  
bool vis[MAXN];  
int pre[MAXN], cost[MAXN][MAXN],lowcost[MAXN];
void Dijkstra(int n,int beg)  {
    int i,j;
    for(i=0;i<n;i++)   
        lowcost[i]=INF,vis[i]=false,pre[i]=-1;  
    lowcost[beg]=0;  
    for( j=1;j<=n;j++)  {  
        int k=-1;  
        int Min=INF;  
        for(i=0;i<n;i++)  
            if(!vis[i]&&lowcost[i]<Min) 
                Min=lowcost[i],k=i;    
        if(k==-1)break;  
        vis[k]=true;  
        for(i=0;i<n;i++)  
            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])  
                lowcost[i]=lowcost[k]+cost[k][i],pre[i]=k;  
    }  
}  
int main()
{
    int t,n,i,j,ans,k;
    scanf("%d",&t);
    for(int id=1;id<=t;id++)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&cost[i][j]);
            }
        }

        int flag=0;
        for(i=0;i<n;i++)
        {
            Dijkstra(n,i);
            for(j=0;j<n;j++)
            {
                if(lowcost[j]!=cost[i][j])
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
        }
        printf("Case %d: ",id);
        if(flag==1)
        {
            printf("impossible\n");
        }
        else 
        {
            ans=0;
            for(k=0;k<n;k++)
            {
                for(i=0;i<n;i++)
                {
                    for(j=0;j<n;j++)
                    {
                        if(cost[i][j]==cost[i][k]+cost[k][j]&&i!=j&&k!=i&&k!=j)
                        {
                            cost[i][j]=INF;
                        }
                    }
                }
            }
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(!(cost[i][j]==0||cost[i][j]==INF))
                    {
                        ans++;
                    }
                }
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}
View Code