做了一天……

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. LoadRuner常见错误

    LoadRuner常见错误 一.Step download timeout (120 seconds) 这是一个经常会遇到的问题,解决得办法走以下步骤: 1. 修改run time setting中的 ...

  2. git推送本地仓库到github

    总结一下,方便后人,也方便自己查阅.直接写步骤 一.本地创建一个文件夹,在里面写项目的文件(* .php/*.js.....). git本地操作: 1 .  cd  /path/to/project  ...

  3. ref:如何将自定义异常的信息显示在jsp页面上

    ref:https://blog.csdn.net/tao_ssh/article/details/53486449 在项目中,经常会抛出异常,输出比较友好的信息来提示用户,并指导用户行为.大体思路: ...

  4. TCP 建立连接为什么要握 3 次手?

    上次已经说过,没有协议,不成方圆,计算机之间的通信更是依赖于协议.今天就重点分析一下 TCP 协议. 传输控制协议 TCP 是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 7 ...

  5. Bipartite Graph hdu 5313 bitset 并查集 二分图

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset   ...

  6. Ace-editor 输入内容时光标闪动,定位错乱的解决方案

    请尝试将字体设置成12PX或者14px(偶数),避免设置成13px. 应该就可以解决. 同时向大家推荐一款可直接生成文档的API调试.管理工具(中文PostMAN):https://www.apipo ...

  7. Elasticsearch源码分析 | 单节点的启动和关闭

    本文主要简要介绍Elasticsearch单节点的启动和关闭流程.Elasticsearch版本:6.3.2 相关文章 1.Google Guice 快速入门 2.Elasticsearch 中的 G ...

  8. [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  9. ASP.NET与MVC架构区别总结

    1)ASP.NET Webforms Behind Code利于快速开发,方便可视化操作. 2)ASP.NET 使用了“基于视图”的解决方案去应对“基于行为”的需求,它处理了客户端的请求,IIS将请求 ...

  10. ASP.NET 构建高性能网站 第1篇

    网站优化需要考虑的方面 在用ASP.NET开发网站的时候,性能是永远需要考虑和关注的问题,性能不仅仅只是程序代码执行时候的速度,而是涉及到方方面面的东西. 就拿ASP.NET的一个请求来讲,从浏览器向 ...