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

然后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. QFontMetrics的一个问题

    今天发现QFontMetric的一个问题 QFontMetrics可以输入一个字体和一个字符串,计算出字符串在这种字体下的显示尺寸. 这种计算比较耗时间,因此Qt内部应该是缓存了计算结果.具体方法是在 ...

  2. IntelliJ IDEA 快捷键备忘

    打开关闭项目结构树 Alt + 1 查看方法定义 Ctrl + B 查看方法实现 Ctrl + Alt + B 查看类结构 Ctrl + F12 弹出 或 Alt + 7 右侧栏 查看类继承结构 Ct ...

  3. IntelliJ IDEA 打包可运行的 JAR

    ## 构建说明 创建Artifest任务 * File -> Project Structure -> Artifacts -> + JAR* 选择 From module with ...

  4. (原创)mybatis学习二,spring和mybatis的融合

    mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...

  5. 返回标量CLR自定义函数

    昨天有学习了返回表自定义函数<CLR Table-Valued函数>http://www.cnblogs.com/insus/p/4378354.html.今天学习另一个,实现返回标量(S ...

  6. Windows 8 开发系列汇总

    Windows 8 应用开发 Windows 8 应用开发 - 异步调用 Windows 8 应用开发 - 本地数据存储 Windows 8 应用开发 - 挂起与恢复 Windows 8 应用开发 - ...

  7. Jenkins持续集成

    Jenkins持续集成 & .NET   最近受累于测试环境每次发布都很麻烦,而且我们有多个测试环境,因此专门抽时间做了Jenkins的配置和研究. 折腾了两天终于绿灯以后,先来个截图,Blu ...

  8. JavaScript的attribute和property辨析

    1.Attribute Attribute是HTML上设置的属性,在html中显式地设置,或者通过setAttribute()方法设置. <input type='text' id='txt' ...

  9. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  10. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...