zoj1857Fire Station最短路

  乱搞题。就是输入有点问题,我开始用的 scanf("%d%d%d",&a,&b,&c) !=EOF 然后就妥妥的秒wa 但是poj 莫名奇妙的过了,这时Gxwar 告诉我zoj我过不了,然后我就过不了。。。可是改了下输入就过了。真是神奇。

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <climits>

#include <string>

#include <iostream>

#include <map>

#include <cstdlib>

#include <list>

#include <set>

#include <queue>

#include <stack>

#include<math.h>

using namespace std;

int dis[555];

int dist[555];

int Map[555][555];

const int INF=0xfffffff;

int m;

void floyd()

{

    for(int k=1;k<=m;k++)

    for(int i=1;i<=m;i++){

        for(int j=1;j<=m;j++){

            Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);

        }

    }

}



void spfa(int x)

{

    int vis[555];

    memset(vis,0,sizeof(vis));

    for(int i=1;i<=m;i++) dist[i]= dis[i];

    queue<int> q;

    q.push(x) ; dist[x]= 0 ;vis[x]=1;

    while(!q.empty()){

        int cur= q.front() ;q.pop();

        vis[cur]=0;

        for(int i=1;i<=m;i++){

            if(dist[i]>dist[cur]+Map[cur][i]){

                dist[i]=dist[cur]+Map[cur][i];

                if(!vis[i]){

                    vis[i]=1;q.push(i);

                }

            }

        }

    }

}

int main()

{

    int n;int a,b,c;

    int val[555],vis[555];

    char str[100];

    while(scanf("%d%d",&n,&m)!=EOF){

        memset(vis,0,sizeof(vis));

        memset(val,0,sizeof(val));

        for(int i=1;i<=m;i++)

        for(int j=1;j<=m;j++)

        if(i==j) Map[i][j]=0;else Map[i][j]=INF;

        for(int i=1;i<=m;i++)

            dis[i]=INF;

        for(int i=0;i<n;i++){

            scanf("%d",&val[i]);vis[val[i]]= 1; dis[val[i]]= 0;

        }

        getchar();

        while(gets(str)&&strlen(str)){

            sscanf(str,"%d%d%d",&a,&b,&c);

            Map[a][b]=Map[b][a]=c;

        }

        floyd();

        for(int i=0;i<n;i++){

            for(int j=1;j<=m;j++){

                if(vis[j]) continue;

                if(dis[j]>Map[val[i]][j]) dis[j] = Map[val[i]][j];

            }

        }

        for(int i=0;i<n;i++){

            dis[val[i]]=0;

        }

        int Max=0;

        for(int i=1;i<=m;i++)

            if(dis[i]>Max) Max= dis[i];

        int flag=1;

        for(int i=m;i>=1;i--){

            if(vis[i]) continue;

            int Max1=0;

            spfa(i);

            for(int j=1;j<=m;j++){

                if(vis[j]) continue;

                if(dist[j]>Max1) Max1=dist[j];

            }

            if(Max1<=Max){

                Max= Max1; flag= i;

            }



        }

        printf("%d\n",flag);

    }

    return 0;

}

 

你可能感兴趣的:(最短路)