POJ 2607 Fire Station

枚举+最短路问题。

题意依然晦涩难懂。

新建一个消防站n 可以使得所有交叉路口到最近的一个消防站的距离中最大值减小,且n 是满足条件的交叉路口序号中序号最小的。

先每个消防站做SPFA。找到所有点 到最近消防站的 距离。

然后枚举 每个不是消防站的点,找到距离这个点的最大距离。然后比对 最大是否更新了。

ORZ的是,输入边的时候要EOF。简直……

谁是出题人,看我不把他脸按到键OWIHW#ROIJHA(P*#RY(#*Y(*#@UISHIUOHEOIF

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
struct lx
{
    int v,len;
};
vector<lx>g[501];
int n,m;
bool thend[501];
int d[501];
void SPFA(int start,int *dis)
{
    queue<int>q;
    bool vis[501];
    for(int i=1;i<=n;i++)
    vis[i]=0;
    dis[start]=0;
    vis[start]=1;
    q.push(start);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int j=0; j<g[u].size(); j++)
        {
            int v=g[u][j].v;
            int len=g[u][j].len;
            if(dis[v]>dis[u]+len)
            {
                dis[v]=dis[u]+len;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(int i=1; i<=n; i++)
            thend[i]=0,g[i].clear();
        for(int i=1; i<=m; i++)
        {
            int tmp;
            scanf("%d",&tmp);
            thend[tmp]=1;
        }
        int u,v,len;
        while(scanf("%d%d%d",&u,&v,&len)!=EOF)
        {
            lx now;
            now.len=len;
            now.v=v,g[u].push_back(now);
            now.v=u,g[v].push_back(now);
        }
        for(int i=1;i<=n;i++)
            d[i]=INF;

        for(int i=1;i<=n;i++)
            if(thend[i])
            {
                SPFA(i,d);
            }
        int minn=INF;
        int ans=1;
        for(int i=1;i<=n;i++)
        {
            int maxn=0;
            if(thend[i])continue;
            int dis[501];

            for(int j=1;j<=n;j++)
                dis[j]=d[j];
            SPFA(i,dis);

            for(int j=1;j<=n;j++)
                maxn=max(maxn,dis[j]);
            if(minn>maxn)
            {
                minn=maxn;
                ans=i;
            }
        }
        printf("%d\n",ans);
    }
}
时间: 2024-11-08 12:56:06

POJ 2607 Fire Station的相关文章

poj 2607 Fire Station (spfa)

Fire Station Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3783   Accepted: 1337 Description A city is served by a number of fire stations. Some residents have complained that the distance from their houses to the nearest station is to

POJ 2607

一次FLOYD,再枚举. 注意题目要求的输出是什么哦. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int inf=9999999; 8 const int MAXN=505; 9 int maze[MAXN][MAXN]; 10 bool house[MAXN];

Nyoj Fire Station

描述A city is served by a number of fire stations. Some residents have complained that the distance from their houses to the nearest station is too far, so a new station is to be built. You are to choose the location of the fire station so as to reduce

poj 4045 Power Station(初涉树形dp)

http://poj.org/problem?id=4045 大致题意:有n个村庄,求将发电站建在哪一个村庄使得花费最少.这是一个无向无环图.简化一下就是求一个节点使它到其他所有节点的距离和最小. 起初一直在向最短路上靠,但因为节点和边数太大,必定TLE.然后无比强大的啸神随便写了两个dfs就过掉了,简直膜拜.赛后搜了搜题解,发现这是道树形dp.sad,真的要好好刷dp了. 大体思路是将这个无向无环图看做一个树,我们就在这个树上进行动态规划.首先先随便拿一个节点看做根节点(假设节点1),计算出它

uva Fire Station(FLODY+枚举)(挺不错的简单题)

消防站 题目链接:Click Here~ 题意分析: 就是给你f个消防站,n个路口.要你求出在已有消防站的基础上在n个路口的哪个路口上在建立一个消防站,使得n个路口的到离自己最近的消防站最近的距离中最大的一个值最小.即:求n个最近路口中最大的一个,使其改最大值最小.详细的要求自己看题目吧~ 算法分析: 因为,是n个路口到每个消防站的距离.所以,我们可以想到先用一次Flody算法.把每两点的最近距离给算出来.之后在枚举N个路口,进行判断比较得出答案. #include <iostream> #i

POJ 2152 Fire

Fire Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 215264-bit integer IO format: %lld      Java class name: Main Country Z has N cities, which are numbered from 1 to N. Cities are connected by highways, and

poj 4045 Power Station dfs求树上最小距离和

题意: 给一棵树,每条边的权值为R*I^2,求到所有其他节点权值和最小的点和相应最小权值和. 分析: 先将图转化成树,然后在树上dfs. 代码: //poj 4045 //sep9 #include<iostream> #include<vector> using namespace std; const int maxN=50012; vector<int> g[maxN]; int vis[maxN],bro[maxN],son[maxN]; __int64 num

UVa 10278 - Fire Station

题目:一个城市有i个小镇,其中有一些小镇建有消防站,现在想增加1个消防站, 使得所有小镇到最近的消防站的距离中的最大值最小. 分析:图论,最短路.利用spfa算法可以高效解决本问题. 首先,利用已有的消防站,计算多源最短路径,储存在集合dist中: 然后,枚举所有顶点,计算单元最短路,存储在集合newd中,则得到新的多元最短路集合S: 他的元素为对应newd与dist元素的最小值,即S = { min(dist(i),newd(i))}: (如果,一个新的消防站可以更新之前消防站的最短路,则这组

POJ 2152 Fire(树形DP)

题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... 1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 int tot,go[200005],first[200005],next[200005],val[2000