【BZOJ】【2200】【USACO 2011 Jan】道路和航线
做了一天……
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】道路和航线的更多相关文章
- 【USACO 2011】 道路和航线
[题目链接] 点击打开链接 [算法] SPFA + SLF / LLL 优化 [代码] #include<bits/stdc++.h> using namespace std; #defi ...
- BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1128 Solved: 414[Submit] ...
- [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- bzoj 2200: [Usaco2011 Jan]道路和航线——拓扑+dijkstra
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- BZOJ 2200: [Usaco2011 Jan]道路和航线
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- 2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- [Usaco2011 Jan]道路和航线
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- 【BZOJ】2200: [Usaco2011 Jan]道路和航线
[题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spf ...
- bzoj 2200: [Usaco2011 Jan]道路和航线【spfa】
直接跑最短路就行了--还不用判负环 #include<iostream> #include<cstdio> #include<queue> using namesp ...
随机推荐
- 三 oracle 用户管理一
一.创建用户概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用.create user 用户名 identified by 密码; ...
- tomcat中请求参数中文中乱码问题
在server.xml中配置如下: <Connector connectionTimeout="20000" port="8080" protocol=& ...
- 全文搜索引擎 Elasticsearch (二) 使用场景
1.场景—:使用Elasticsearch作为主要的后端 传统项目中,搜索引擎是部署在成熟的数据存储的顶部,以提供快速且相关的搜索能力.这是因为早期的搜索引擎不能提供耐用的存储或其他经常需要的功能 ...
- 使用ASP.NET MVC+Entity Framework快速搭建系统
详细资料: http://www.cnblogs.com/dingfangbo/p/5771741.html 学习 ASP.NET MVC 也有一段时间了,打算弄个小程序练练手,做为学习过程中的记录和 ...
- 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现
在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...
- JAVA基础部分面试
1:面向对象编程有很多重要的特性: 封装,继承,多态和抽象. 2:什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? (1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.J ...
- 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
一.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...
- Linux 下安装软件包的方法
Linux应用软件的安装包有三种: 1) tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. 2) rpm包,如software-1.2.3-1. ...
- An ac a day,keep wa away
zoj 初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 1334 ...
- SQLite3知识(1)--教程
1.SQLite3教程 [1].SQLite 教程 2.选择数据库: [2]. SQLite Select 语句 3.更新数据库: [3]. SQLite Update 语句 4.插入数据库: [4] ...