做了一天……

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. USACO 4.4 Shuttle Puzzle

    Shuttle PuzzleTraditional The Shuttle Puzzle of size 3 consists of 3 white marbles, 3 black marbles, ...

  2. 004 爬虫(最初的爬虫方式,以及urllib2)

    一:最初的爬取方式 1.代码示例 # coding=utf-8 import urllib2 request=urllib2.Request("http://www.baidu.com&qu ...

  3. 使用ASP.NET MVC+Entity Framework快速搭建系统

    详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...

  4. Spring boot整合shiro权限管理

    Apache Shiro功能框架: Shiro聚焦与应用程序安全领域的四大基石:认证.授权.会话管理和保密. #,认证,也叫作登录,用于验证用户是不是他自己所说的那个人: #,授权,也就是访问控制,比 ...

  5. 一、django rest_framework源码之总体流程剖析

    1 序言 有如下django代码,视图层: from django.http import HttpResponse from rest_framework.views import APIView ...

  6. ICMP隧道工具ptunnel

    ICMP隧道工具ptunnel   在一些网络环境中,如果不经过认证,TCP和UDP数据包都会被拦截.如果用户可以ping通远程计算机,就可以尝试建立ICMP隧道,将TCP数据通过该隧道发送,实现不受 ...

  7. 简单介绍下python中函数的基础语法

    python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 pyt ...

  8. 为什么全部width:100%浏览器边缘存在留白?

    一般浏览器都给body加了外边距,margin:0应该能解决你所遇到的问题.但你很可能又会遇到其他奇怪的现象,比如说p的行高,在不同浏览器上显示不一致,最根本的解决方案还是重置浏览器默认样式. 可以使 ...

  9. LeetCode:整数反转(Reserve Integer)

    public class ReserveInteger { public int reverse(int x) { //用于接收个位数(10的余数) int remainder; //是否负数 int ...

  10. mysql长连接

    长连接是干嘛的:  它是做连接复用的: 在openresty中的lua-resty-mysql 里 connect方法去连接mysql时会去ngx_lua cosocket连接池中寻找是否有可用连接 ...