先忽略航线,求出图中所有连通块,再用航线拓扑排序求出每个连通块的优先级

然后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]道路和航线的更多相关文章

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

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

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

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

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

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

  4. [Usaco2011 Jan]道路和航线

    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. 【BZOJ】2200: [Usaco2011 Jan]道路和航线

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

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

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

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

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

  9. BZOJ2200 道路和航线【好题】【dfs】【最短路】【缩点】

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

随机推荐

  1. 程序Bug---易错点

    只有当图像与HTML文档在同一目录时,才能用相对地址显示.

  2. 未找到数据,异常处理:exception when no_data_found then 异常处理语句;

    未找到数据. 在 select 字段 Into 变量 from 表 where 条件: 这种语句中很有可能会有select 不到数据的问题,导致报错"未找到数据" 要解决这种问题需 ...

  3. 封装jQuery Validate扩展验证方法

    一.封装自定义验证方法-validate-methods.js /***************************************************************** j ...

  4. 源码安装mysql

    1. 安装依赖组件 # yum install gcc gcc-c++ ncurses-devel perl -y   2. 安装cmake # wget http://www.cmake.org/f ...

  5. win10显示此电脑

    http://jingyan.baidu.com/article/3aed632e00dfe17011809169.html

  6. BZOJ 1087 【SCOI2005】 互不侵犯King

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  7. 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 ...

  8. velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools

    通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...

  9. 【转】aspx与aspx.cs的关系

    原文地址: http://www.cnblogs.com/axzxs2001/archive/2009/01/19/1378383.html 在vs中,有很多朋友问起,在一个网站项目中的aspx和as ...

  10. Word 打包 zip 并提供下载

    该篇博客记录Java Web项目将word打包zip并提供下载功能的实现和其中遇到的坑,方便后续自己的查看的参照. 1. 后台处理的java 方法 首先将所有的word生成到uploadword目录下 ...