• 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
    ");
            }
            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
    ",ans);
            }
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    简单批处理内部命令简介(转)
    CPU 内存 频率 DDR DDR2 DDR3
    python 正则表达式
    bat 脚本 > >> 管道
    python 多进程 无数进程 重复进程 死机
    NLP相关期刊和会议
    deamon tools dtsoft virtual cdrom device 失败 错误
    占位
    2011年07月03日的日记
    每周总结(第二周)
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3728673.html
Copyright © 2020-2023  润新知