sdut Emergency

用的时候太不细心关注细节问题了

#include<iostream>

#include<stdio.h>
#include<cstring>
using namespace std;
int map[333][333];
int v[333];
#define INF 999999999
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int main()
{
    int i,j;
    int n,m,q,x,y,w,k;
    int cas=0;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        cas++;
        if(n==0&&m==0&&q==0)
            break;
        memset(v,0,sizeof(v));
        for(i=0;i<n;i++)                           //有可能存在重边  取最小的边
        {
            for(j=0;j<n;j++)
                map[i][j]=INF;
            map[i][i]=0;
        }
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&x,&y,&w);
            if(map[x][y]>w)
                map[x][y]=w;
        }
        printf("Case %d: ",cas);
        while(q--)
        {
            scanf("%d",&w);
            if(w==1)                                  //一开始全没解放  直接输出
            {
                scanf("%d%d",&x,&y);
                if(!v[x]||!v[y])
                {
                    printf("City %d or %d is not available. ",x,y);
                    continue;
                }
                if(map[x][y]!=INF)
                    printf("%d ",map[x][y]);
                else
                    printf("No such path. ");
            }
            else                                                        //用floyd算法 更新通过x点的边的最短路径
            {
                
                scanf("%d",&x);
                if(v[x])
                {
                    printf("City %d is already recaptured. ",x);
                }
                else
                {
                    
                    v[x]=1;
                    k=x;
                    for(i=0;i<n;i++)
                        for(j=0;j<n;j++)
                        {
                            if(map[i][k]!=INF&&map[k][j]!=INF)//  注意最佳选择是不管解没解放  都要算出来经过k的路程 因为更新非解救城市的时候需要用到
                            if(map[i][k]+map[k][j]<map[i][j])
                            {
                                map[i][j]=map[i][k]+map[k][j];
                            }
                        }
                        
                        
                }
                
            }
        }
        printf(" ");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zhangdashuai/p/3702164.html