zoukankan      html  css  js  c++  java
  • POJ2394 Checking an Alibi 基础最短路

    /*
    *State: 2394    Accepted    724K    16MS    G++    1789B    
    *题目大意:
    *        给定无向图,输入的c代表c个奶牛,然后输入c个点的位置,
    *        求能够在t时间内到达点1的牛。
    *解题思路:
    *        直接spfa吧。
    */
    View Code
    #include <iostream>
    #include <queue>
    using namespace std;
    
    const int MAXN = 505;
    const int MAXE = 1024;
    const int inf = 0x3f3f3f3f;
    
    typedef struct _node
    {
        int v, w;
        int next;
    }N;
    
    N edge[2 * MAXE];
    int head[MAXN], cntEdge, endDis[MAXN];
    int dis[MAXN];
    
    void init(int n)
    {
        cntEdge = 0;
        for(int i = 0; i <= n; i++)
        {
            head[i] = -1;
        }
    }
    
    void addEdge(int u, int v, int w)
    {
        edge[cntEdge].v = v;
        edge[cntEdge].w = w;
        edge[cntEdge].next = head[u];
        head[u] = cntEdge++;
    
        edge[cntEdge].v = u;
        edge[cntEdge].w = w;
        edge[cntEdge].next = head[v];
        head[v] = cntEdge++;
    }
    
    
    void spfa(int s, int n)//dir == 1反图
    {
        int vst[MAXN] = {0};
        for(int i = 0; i <= n; i++)
            dis[i] = inf;
    
        queue<int> Q;
        Q.push(s);
        vst[s] = 1;
        dis[s] = 0;
    
        while(!Q.empty())
        {
            int pre = Q.front();
            Q.pop();
            vst[pre] = 0;
    
            for(int f = head[pre]; f != -1; f = edge[f].next)
            {
                int son = edge[f].v, w = edge[f].w;
                if(dis[pre] + w < dis[son])
                {
                    dis[son] = dis[pre] + w;
                    if(!vst[son])
                    {
                        vst[son] = 1;
                        Q.push(son);
                    }
                }
            }
        }
    
        return ;
    }
    
    int main(void)
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
    #endif
    
        int n, m, c, t;
        while(scanf("%d %d %d %d", &n, &m, &c, &t) == 4)
        {
            init(n);
            int u, v, w;
            for(int i = 0; i < m; i++)
            {
                scanf("%d %d %d", &u, &v, &w);
                addEdge(u, v, w);
            }
            spfa(1, n);
            int ans[MAXN], cnt = 0;
            for(int i = 1; i <= c; i++)
            {
                int s;
                scanf("%d", &s);
                if(dis[s] <= t)
                    ans[cnt++] = i;
            }
            printf("%d\n", cnt);
            for(int i = 0; i < cnt; i++)
                printf("%d\n", ans[i]);
        }
        return 0;
    }
  • 相关阅读:
    install kde in ubuntu
    Upgrade to or Install Cinnamon 2.4 in Ubuntu
    enjoy dollar vs cash dollar
    opencv linux
    高频交易都有哪些著名的算法
    wpf
    opencv mat flags含义
    gphoto2 canon eos450d
    gphoto2
    task optimization之superglue分析
  • 原文地址:https://www.cnblogs.com/cchun/p/2645065.html
Copyright © 2011-2022 走看看