hdu3631 floyd

题目的意思是给定n个顶点m条边,边允许重边,取小值;计算标记点的最短路。有两种询问方式,第一种,就是标记点,第二种就是输出两点间的最短路。

本题是要我们了解floyd的思想,还有就是,本题会爆int。应该用__int64 或long long型;我就被坑了两次;

#include<istream>
using namespace std;
const int N=309;
const int inf=1<<30;
int vis[N];
__int64 dp[N][N];
int n,m;
void floyd(int k)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(dp[i][j]>dp[i][k]+dp[k][j])
                dp[i][j]=dp[i][k]+dp[k][j];
        }
    }
}
int main()
{
    int q,i,a,b,w,t=1;
    while(scanf("%d%d%d",&n,&m,&q),n+m+q)
    {
        if(t>1)
            printf("
");
        printf("Case %d:
",t++);
        for(i=0;i<n;i++)
        {
            dp[i][i]=0;
            vis[i]=0;
            for(int j=i+1;j<n;j++)
                dp[i][j]=dp[j][i]=inf;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&w);
            if(dp[a][b]>w)
                dp[a][b]=w;
        }

        for(i=0;i<q;i++)
        {
            scanf("%d",&a);
            if(!a)
            {
                scanf("%d",&b);
                if(vis[b])
                    printf("ERROR! At point %d
",b);
                else
                {
                    vis[b]=1;
                    floyd(b);
                }
            }else
            {
                int u,v;
                scanf("%d%d",&u,&v);
                if(vis[u]&&vis[v])
                {
                    if(dp[u][v]!=inf)
                        printf("%I64d
",dp[u][v]);
                    else
                        printf("No such path
");
                }else
                {
                    printf("ERROR! At path %d to %d
",u,v);
                }

            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/BruceNoOne/p/3244134.html