hunnu 11152 Invasion 迪杰斯特拉 修改

来源:互联网 发布:蜜桃影院源码 编辑:程序博客网 时间:2024/06/16 18:44

http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11152


外星人要在一些点上建殖民地

定义安全位置为到达任意殖民地的距离都 >= k,

问每次扩展殖民地后的安全位置,

思路:每次统计危险位置的数目


#include <stdio.h>#include <string.h>#include <queue>#include <vector>using namespace std;#define N 10001#define inf 1000001#define pii pair<int,int>int dist[N];int vis[N],st[N];int m,n,a,k;int dan;vector < pii > vec[N];int dij(int src ){    dist[src] = 0;    if(!vis[src])    {        vis[src] = 1;        ++dan;    }    priority_queue<pii > que;    que.push(make_pair(0,src));    pii p;    int u,v,i,c;    while(!que.empty())    {        p = que.top();        que.pop();        u = p.second;        if(st[u])///剪枝            continue;        int len = vec[u].size();        for(i = 0; i < len; ++i)        {            v = vec[u][i].second;            c = vec[u][i].first;                        if(dist[u] + c < k)///剪枝            {                if(!vis[v])                {                    ++dan;                    vis[v] = 1;                }                if(dist[u] + c < dist[v])///剪枝                {                    dist[v] = dist[u] + c;                    que.push(make_pair(dist[v],v));                }            }        }    }    return m - dan;}int main(){    while(scanf("%d%d%d%d",&m,&n,&a,&k)!= EOF && m)    {        int u,v,c;        int i;        while(n--)        {            scanf("%d%d%d",&u,&v,&c);            vec[u].push_back(make_pair(c,v));            vec[v].push_back(make_pair(c,u));        }        memset(vis,0,sizeof(vis));        memset(st,0,sizeof(st));        for(i = 1; i <=m; ++i)            dist[i] = inf;        dan = 0;        while(a--)        {            scanf("%d",&u);            printf("%d\n",dij(u));            st[u] = 1;        }        puts("");        for(i = 1; i <= m; ++i)            vec[i].clear();    }    return 0;}/*7 6 3 31 2 11 3 12 5 13 6 11 4 14 7 22141 0 1 110 0 0 0*/






原创粉丝点击