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 不在场的证明的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1597: [Usaco2008 Mar]土地购买 2011-12-27