2/3 P6770 [USACO05MAR]Checking an Alibi 不在场的证明

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2/3 P6770 [USACO05MAR]Checking an Alibi 不在场的证明相关的知识,希望对你有一定的参考价值。

https://www.luogu.com.cn/problem/P6770
本题就是输出从结点1到各个有牛的结点的最小时间在M范围内的有牛结点,升序输出其编号。
刚开始没能ac,错误应该在输出格式上。
算法之外的代码应该写的逻辑清晰一点,一个数组尽量只代表一个意思。
(使用了链式前向星和对优化,算是最短路径的复杂度最低的揭发了,即使数据量大到十万级别也没事)

#include <bits/stdc++.h>

using namespace std;
const int maxn=500005;
typedef long long ll;
const int inf=0x7fffffff;
struct node

    int to,dis,nxt;
e[maxn];
int head[maxn],s,t,u,v,w,nxt,cnt,F,P,C,M,tmp;
ll dist[maxn],minn,cow[maxn];
bool vis[maxn];
void add_edge(int from,int to,int dis)

    e[++cnt].to=to;
    e[cnt].dis=dis;
    e[cnt].nxt=head[from];
    head[from]=cnt;

struct node1

    int dis,pos;
    bool operator <(const node1 &x)const
    
        return x.dis<dis;
    
;
priority_queue<node1>q;
void dijkstra()

    s=1;
    dist[s]=0;
    q.push((node1)0,s); //到该点的距离为0,位置为点s
    while(!q.empty())
    
        node1 cur=q.top();
        q.pop();
        int x=cur.pos;
        if(vis[x]) continue;
        vis[x]=1;
        for(int i=head[x];i!=-1;i=e[i].nxt)
        
            int y=e[i].to;
            if(dist[y]>dist[x]+e[i].dis)
            
                dist[y]=dist[x]+e[i].dis;
                if(!vis[y])
                
                    q.push((node1)dist[y],y);
                
            
        
    

int main()

    scanf("%d%d%d%d",&F,&P,&C,&M);
    head[0]=-1;
    for(int i=1;i<=F;i++)
    
        dist[i]=inf;
        head[i]=-1;
    
    for(int i=1;i<=P;i++)
    
        scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    
    dijkstra();
    for (int i = 1, x; i <= C; i++)
    
        scanf("%d", &x);
        if (dist[x] <= M)
            cow[++tmp] = i;
    
    printf("%d\\n", tmp);
    sort(cow + 1, cow + tmp + 1);
    for (int i = 1; i <= tmp; i++)
        printf("%d\\n", cow[i]);
    return 0;

以上是关于2/3 P6770 [USACO05MAR]Checking an Alibi 不在场的证明的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1597USACO 2008 Mar土地购买

[Usaco2014 Mar]Sabotage

USACO 历年月赛 官方测试数据

bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27

NC24325 [USACO 2012 Mar S]Flowerpot

1597: [Usaco2008 Mar]土地购买