bzoj2200: [Usaco2011 Jan]道路和航线
先忽略航线,求出图中所有连通块,再用航线拓扑排序求出每个连通块的优先级
然后dijkstra时优先处理优先级高的块里的点就行了
ps:这题SPFA会TLE
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#define N 25003
#define M 150004 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
bool flag=0;
while (ch<'0' || ch>'9'){
flag=ch=='-';
ch=getchar();
}
while ('0'<=ch && ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return flag?-ret:ret;
} struct edge{
int adj,next,len;
edge(){}
edge(int _adj,int _next,int _len):adj(_adj),next(_next),len(_len){}
} e[M];
int n,g[N],m,di[N];
void AddEdge(int u,int v,int w){
e[++m]=edge(v,g[u],w);g[u]=m;
} int col[N],cnt;
int q[N],qh,qt;
int a[N],start[N];
int degree[N];
int level[N];
void bfs(){
qh=qt=0;
memset(col,0,sizeof(col));
for (int i=1;i<=n;++i)if (!col[i]){
q[++qt]=i;
col[i]=++cnt;
start[cnt]=qt;
while (qh<qt){
int u=q[++qh];
for (int i=di[u];i;i=e[i].next){
int v=e[i].adj;
if (col[v]) continue;
col[v]=cnt;
q[++qt]=v;
}
}
}
start[cnt+1]=qt+1;
for (int i=1;i<=qt;++i) a[i]=q[i];
memset(degree,0,sizeof(degree));
for (int j=1;j<=n;++j)
for (int i=g[j];i!=di[j];i=e[i].next){
int v=e[i].adj;
++degree[col[v]];
}
qh=qt=0;
for (int i=1;i<=cnt;++i)
if (!degree[i]) q[++qt]=i;
int now=0;
while (qh<qt){
int u=q[++qh];
level[u]=++now;
for (int j=start[u];j<start[u+1];++j)
for (int i=g[a[j]];i!=di[a[j]];i=e[i].next){
int v=e[i].adj;
if (!--degree[col[v]]) q[++qt]=col[v];
}
}
} struct HeapNode{
int pos,value;
HeapNode(){}
HeapNode(int _pos,int _value):pos(_pos),value(_value){}
};
inline bool operator >(const HeapNode &x,const HeapNode &y){
return (level[col[x.pos]]>level[col[y.pos]]||level[col[x.pos]]==level[col[y.pos]]&&x.value>y.value);
}
priority_queue<HeapNode,vector<HeapNode> ,greater<HeapNode> > h; int mind[N];
bool flag[N];
void dijkstra(int _s){
memset(mind,127,sizeof(mind));
memset(flag,0,sizeof(flag));
while (!h.empty()) h.pop();
h.push(HeapNode(_s,mind[_s]=0));
while (!h.empty()){
int u=h.top().pos;
flag[u]=1;
h.pop();
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (mind[v]>mind[u]+e[i].len){
mind[v]=mind[u]+e[i].len;
h.push(HeapNode(v,mind[v]));
}
}
while (!h.empty()&&flag[h.top().pos]) h.pop();
}
} int main(){
n=read();int m0=read(),m1=read(),s=read();
memset(g,0,sizeof(g));m=1;
while (m0--){
int u=read(),v=read(),w=read();
AddEdge(u,v,w);
AddEdge(v,u,w);
}
for (int i=1;i<=n;++i) di[i]=g[i];
while (m1--){
int u=read(),v=read(),w=read();
AddEdge(u,v,w);
}
bfs();
dijkstra(s);
for (int i=1;i<=n;++i)
if (mind[i]>(1<<30)) puts("NO PATH");
else printf("%d\n",mind[i]);
return 0;
}
bzoj2200: [Usaco2011 Jan]道路和航线的更多相关文章
- 2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- [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条 ...
- [Usaco2011 Jan]道路和航线
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- BZOJ 2200: [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 ...
- BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1128 Solved: 414[Submit] ...
- BZOJ2200 道路和航线【好题】【dfs】【最短路】【缩点】
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1384 Solved: 508[Submit] ...
随机推荐
- 程序Bug---易错点
只有当图像与HTML文档在同一目录时,才能用相对地址显示.
- 未找到数据,异常处理:exception when no_data_found then 异常处理语句;
未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...
- 封装jQuery Validate扩展验证方法
一.封装自定义验证方法-validate-methods.js /***************************************************************** j ...
- 源码安装mysql
1. 安装依赖组件 # yum install gcc gcc-c++ ncurses-devel perl -y 2. 安装cmake # wget http://www.cmake.org/f ...
- win10显示此电脑
http://jingyan.baidu.com/article/3aed632e00dfe17011809169.html
- BZOJ 1087 【SCOI2005】 互不侵犯King
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- Could not load file or assembly 'System.Data.SQLite' or one of its dependencies
试图加载格式不正确的程 异常类型 异常消息Could not load file or assembly 'System.Data.SQLite' or one of its dependencies ...
- velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...
- 【转】aspx与aspx.cs的关系
原文地址: http://www.cnblogs.com/axzxs2001/archive/2009/01/19/1378383.html 在vs中,有很多朋友问起,在一个网站项目中的aspx和as ...
- Word 打包 zip 并提供下载
该篇博客记录Java Web项目将word打包zip并提供下载功能的实现和其中遇到的坑,方便后续自己的查看的参照. 1. 后台处理的java 方法 首先将所有的word生成到uploadword目录下 ...