• Planets


    http://codeforces.com/contest/230/problem/D

    解题思路:求最短路,如果到了那个在t时刻到了i点 且有人的话,就dis++;

    spfa 求解, 用了set ,vector,queue ,fill 加强了对c++函数的学习。

    基于spfa的:

    View Code
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<set>
    #define inf ~0U>>1
    using namespace std;
    const int maxn=100005;
    typedef pair<int,int>pii;
    vector< pii>node[maxn];
    set<int>time[maxn];
    queue< pii> q;
    int dis[maxn];
    int visit[maxn];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            node[a].push_back(pii(b,c));
            node[b].push_back(pii(a,c));
        }
        for(int i=1;i<=n;i++)
        {
            int k;
            scanf("%d",&k);
            while(k--)
            {
                int t;
                scanf("%d",&t);
                time[i].insert(t);
            }
        }
        q.push(pii(0,1));
        fill(dis,dis+n+1,inf);
        dis[1]=0;
        visit[1]=1;
    
        while(!q.empty())
        {
    
            int mm=q.front().second;
            q.pop();
            while(mm<n&&time[mm].count(dis[mm]))dis[mm]++;
            for(int i=0;i<node[mm].size();i++)
            {
                int u=node[mm][i].first;
                int t=node[mm][i].second;
                if(dis[u]>dis[mm]+t)
                {
                    dis[u]=dis[mm]+t;
                    if(!visit[u])
                    {
                        visit[u]=1;
                        q.push(pii(dis[u],u));
                    }
                }
            }
            visit[mm]=0;
        }
        printf("%d\n",dis[n]==inf?-1:dis[n]);
        return 0;
    }

    基于dijkstra的:

    View Code
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<set>
    #define inf ~0U>>1
    using namespace std;
    const int maxn=100005;
    typedef pair<int,int>pii;
    vector< pii>node[maxn];
    set<int>time[maxn];
    priority_queue< pii> q;
    int dis[maxn];
    int visit[maxn];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            node[a].push_back(pii(b,c));
            node[b].push_back(pii(a,c));
        }
        for(int i=1;i<=n;i++)
        {
            int k;
            scanf("%d",&k);
            while(k--)
            {
                int t;
                scanf("%d",&t);
                time[i].insert(t);
            }
        }
        q.push(pii(0,1));
        fill(dis,dis+n+1,inf);
        dis[1]=0;
        while(!q.empty())
        {
    
            int mm=q.top().second;
            q.pop();
            if(visit[mm])continue;
            visit[mm]=1;
            //cout<<mm<<endl;
            while(mm<n&&time[mm].count(dis[mm]))dis[mm]++;
            for(int i=0;i<node[mm].size();i++)
            {
                int u=node[mm][i].first;
                int t=node[mm][i].second;
                if(!visit[u]&&dis[u]>dis[mm]+t)
                {
                    dis[u]=dis[mm]+t;
                    q.push(pii(-dis[u],u));
    
                }
            }
    
        }
        printf("%d\n",dis[n]==inf?-1:dis[n]);
        return 0;
    }
  • 相关阅读:
    select/poll/epoll 对比
    I/O Mutiplexing poll 和 epoll
    Socket 编程IO Multiplexing
    ubuntu12.04 lts 安装gcc 4.8
    time since epoch
    ceph-RGW Jewel版新概念
    支持向量机(svm)
    MachineLearning之Logistic回归
    ML之回归
    ML之监督学习算法之分类算法一 ——— 决策树算法
  • 原文地址:https://www.cnblogs.com/cs1003/p/2710428.html
Copyright © 2020-2023  润新知