做了一天……

TLE:数组开小了-_-#道路是有50000的,双向要乘二。(我特么怎么想的就以为是树了……)

WA:一些大点都WA了,小点都过了。好纠结……

AC了QAQ,不知道为什么,在并查集合并的时候写成fa[x]=y就会WA,写成fa[y]=x就AC……这不是一样的吗?

(虽然说是fa[y]=x是把出边到达的节点的fa都置为x,好像更符合人的思维= =)

Update:由于是宽搜,所以是有“祖先后代“关系的,如果写成fa[x]=y就相当于把所有的祖先后代关系反过来……当然原本是同一系的关系就会变得分裂开了!

 /**************************************************************
Problem: 2200
User: Tunix
Language: C++
Result: Accepted
Time:688 ms
Memory:5432 kb
****************************************************************/ //BZOJ 2200
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
void read(int &v){
v=; int sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
v*=sign;
}
/******************tamplate*********************/
const int N=,INF=1e9;
int to[N<<],next[N<<],head[N],len[N<<],cnt;
inline void add(int x,int y,int z){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; len[cnt]=z;
to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt; len[cnt]=z;
}
int t[N],ne[N],h[N],l[N],tot;
inline void ins(int x,int y,int z){
t[++tot]=y; ne[tot]=h[x]; h[x]=tot; l[tot]=z;
}
/*******************edge************************/
int in[N],n,R,P,S;
struct node{
int dist,num;
bool operator < (const node &now)const{
return dist>now.dist;
}
};
int dist[N];
priority_queue<node>Q;
bool done[N];
queue<int>tp;//拓扑
int fa[N];
int find(int x){ return fa[x]==x ? x : (fa[x]=find(fa[x]));} vector<int>have[N];
void dijkstra(int x){
int temp=;
rep(i,have[x].size()){
temp=have[x][i];
Q.push((node){dist[temp],temp});
}
while(!Q.empty()){
int now=Q.top().num; Q.pop();
if (done[now]) continue;
done[now]=;
for(int i=head[now];i;i=next[i]){
if (dist[to[i]]>dist[now]+len[i]){
dist[to[i]]=dist[now]+len[i];
Q.push((node){dist[to[i]],to[i]});
}
}
for(int i=h[now];i;i=ne[i]){
int set=find(t[i]);
if (dist[t[i]]>dist[now]+l[i]){
dist[t[i]]=dist[now]+l[i];
have[set].pb(t[i]);
}
in[set]--;
if (in[set]==) tp.push(set);
}
}
}
/******************dijkstra*********************/
bool vis[N];
void bfs(){
queue<int>q;
vis[S]=; q.push(S);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=next[i])
if (!vis[to[i]]) vis[to[i]]=,q.push(to[i]);
for(int i=h[x];i;i=ne[i]){
++in[find(t[i])];
if (!vis[t[i]]) vis[t[i]]=, q.push(t[i]);;
}
}
}
void solve(){
F(i,,n) fa[i]=i;
F(i,,n){
int x=find(i),y;
for(int j=head[i];j;j=next[j]){
y=find(to[j]);
if (x!=y) fa[y]=x;//就是这里!!!想不通啊想不通
}
}
bfs();
//ready
F(i,,n) { dist[i]=INF;done[i]=;}
dist[S]=;
tp.push(find(S));
have[find(S)].pb(S);
//end
while(!tp.empty()){
dijkstra(tp.front());
tp.pop();
}
F(i,,n)
if (dist[i]!=INF) printf("%d\n",dist[i]);
else printf("NO PATH\n");
}
int main(){
read(n); read(R); read(P); read(S);
int x,y,z;
F(i,,R){
read(x); read(y); read(z);
add(x,y,z);
}
F(i,,P){
read(x); read(y); read(z);
ins(x,y,z);
}
solve();
return ;
}

【BZOJ】【2200】【USACO 2011 Jan】道路和航线的更多相关文章

  1. 【USACO 2011】 道路和航线

    [题目链接] 点击打开链接 [算法] SPFA + SLF / LLL 优化 [代码] #include<bits/stdc++.h> using namespace std; #defi ...

  2. BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)

    2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1128  Solved: 414[Submit] ...

  3. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  4. bzoj 2200: [Usaco2011 Jan]道路和航线——拓扑+dijkstra

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  5. BZOJ 2200: [Usaco2011 Jan]道路和航线

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  6. 2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  7. [Usaco2011 Jan]道路和航线

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  8. 【BZOJ】2200: [Usaco2011 Jan]道路和航线

    [题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spf ...

  9. bzoj 2200: [Usaco2011 Jan]道路和航线【spfa】

    直接跑最短路就行了--还不用判负环 #include<iostream> #include<cstdio> #include<queue> using namesp ...

随机推荐

  1. 【POJ】1026.Cipher

    题解 置换群的快速幂,然而我姿势水平不高,样例过不去,然后才明白这个置换的意思是这个位置上的数代表要把原位置的某个数换过来 需要新开一个数组存结果 代码 #include <iostream&g ...

  2. ThinPHP3.2中 addAll()批量插入数据

    thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. 1 2 3 4 5 6 // 批量添加数据 (only MySQL) $user = M('user'); //ar ...

  3. Wannafly挑战赛9 C - 列一列

    链接:https://www.nowcoder.com/acm/contest/71/C来源:牛客网 题目描述 小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An.尽管他计算 ...

  4. ssm框架常见问题

    搭建SSM框架时,总是遇到这样那样的问题,有的一眼就能看出来,有的需要经验的积累.现将自己搭建SSM框架时遇到的典型问题总结如下: 一.Struts2框架下的action中无法使用@Autowired ...

  5. SDOI 2017 Round2 滚粗了

    没进省队qwq 技不如人,甘拜下风

  6. PHP 笔记——文件引用

    1. 文件路径 "文件路径"指的是被包含文件所在的绝对路径或相对路径. 在相对路径中,"./"表示当前目录,"../"表示当前目录的上级目录 ...

  7. BZOJ2673 [Wf2011]Chips Challenge 费用流 zkw费用流 网络流

    https://darkbzoj.cf/problem/2673 有一个芯片,芯片上有N*N(1≤N≤40)个插槽,可以在里面装零件. 有些插槽不能装零件,有些插槽必须装零件,剩下的插槽随意. 要求装 ...

  8. BZOJ.2194.快速傅立叶之二(FFT 卷积)

    题目链接 \(Descripiton\) 给定\(A[\ ],B[\ ]\),求\[C[k]=\sum_{i=k}^{n-1}A[i]*B[i-k]\ (0\leq k<n)\] \(Solut ...

  9. Codeforces Beta Round #97 (Div. 1) B. Rectangle and Square 暴力

    B. Rectangle and Square 题目连接: http://codeforces.com/contest/135/problem/B Description Little Petya v ...

  10. Codeforces Round #350 (Div. 2) C. Cinema 水题

    C. Cinema 题目连接: http://www.codeforces.com/contest/670/problem/C Description Moscow is hosting a majo ...