2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)
Description
Input
Output
Sample Input
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
样例输入解释:
一共六个城镇。在1-2,3-4,5-6之间有道路,花费分别是5,5,10。同时有三条航线:3->5,
4->6和1->3,花费分别是-100,-100,-10。FJ的中心城镇在城镇4。
Sample Output
NO PATH
NO PATH
5
0
-95
-100
样例输出解释:
FJ的奶牛从4号城镇开始,可以通过道路到达3号城镇。然后他们会通过航线达到5和6号城镇。
但是不可能到达1和2号城镇。
#include<bits/stdc++.h>
using namespace std; int t,r,p,s;
typedef pair<int,int> pii;
const int maxn = 5e4+;
vector<int>belong[maxn];
struct Node
{
int x,y,val,next;
Node(int x=,int y=,int val=,int next=):x(x),y(y),val(val),next(next) {}
} node[][maxn<<]; int head[][maxn];
int cnt[];
int tot;
void add(int x,int y,int val,int t)
{
node[t][++cnt[t]].x = x;
node[t][cnt[t]].y = y;
node[t][cnt[t]].val = val;
node[t][cnt[t]].next = head[t][x];
head[t][x] = cnt[t];
}
int cn[maxn];
int ind[maxn];
int dist[maxn];
bool vis[maxn];
void dfs(int x)
{
cn[x] = tot;
belong[tot].push_back(x);
for(int i=head[][x]; i; i=node[][i].next)
{
int y = node[][i].y;
if(cn[y])
continue;
dfs(y);
}
}
void solve(int s)
{
queue<int>que;
while(!que.empty())
que.pop();
for(int i=; i<=tot; i++)
if(!ind[i])
que.push(i);
// for(int i=1; i<=tot; i++)
// {
// if(!ind[i] && i != cn[s])
// {
// for(int j=0; j<belong[i].size(); j++)
// {
// for(int k=head[1][belong[i][j]]; k; k=node[1][k].next)
// {
// --ind[cn[node[1][k].y]];
// }
// }
// ind[i] = -1;
// //printf("%d ------ %d\n",ind[i],i);
// i=0;
// }
// }
// que.push(cn[s]);
memset(dist,0x3f,sizeof(dist));
dist[s] = ;
priority_queue<pii,vector<pii>,greater<pii> >p;
while(!que.empty())
{
int k = que.front();
que.pop();
while(!p.empty())
p.pop();
int len = belong[k].size();
for(int i=; i<len; i++)
{
if(dist[belong[k][i]] < 0x3f3f3f3f)
p.push(pii(dist[belong[k][i]],belong[k][i]));
}
while(!p.empty())
{
pii t = p.top();
p.pop();
if(vis[t.second])
continue;
vis[t.second] = ;
for(int i=head[][t.second]; i; i=node[][i].next)
{
if(dist[t.second] + node[][i].val < dist[node[][i].y])
{
dist[node[][i].y] = dist[t.second] + node[][i].val;
p.push(pii(dist[t.second] + node[][i].val,node[][i].y));
}
}
for(int i=head[][t.second]; i; i=node[][i].next)
{
dist[node[][i].y] = min(dist[node[][i].y],dist[t.second]+node[][i].val);
}
}
for(int i=; i<len; i++)
{
for(int j=head[][belong[k][i]]; j; j=node[][j].next)
{
if(--ind[cn[node[][j].y]] == )
que.push(cn[node[][j].y]);
}
}
}
} int main()
{
cnt[] = cnt[] = ;
scanf("%d%d%d%d",&t,&r,&p,&s);
for(int i=; i<=t; i++)
belong[i].clear();
for(int i=; i<=r; i++)
{
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
add(u,v,k,);
add(v,u,k,);
} for(int i=; i<=p; i++)
{
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
add(u,v,k,);
}
tot = ;
for(int i=; i<=t; i++)
{
if(!cn[i])
{
tot++;
dfs(i);
}
} for(int i=; i<=cnt[]; i++)
{
ind[cn[node[][i].y]]++;
}
solve(s);
for(int i=; i<=t; i++)
{
if(dist[i] == 0x3f3f3f3f)
printf("NO PATH\n");
else
printf("%d\n",dist[i]);
}
}
2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)的更多相关文章
- 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条 ...
- [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化
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 ...
- bzoj2200: [Usaco2011 Jan]道路和航线
先忽略航线,求出图中所有连通块,再用航线拓扑排序求出每个连通块的优先级 然后dijkstra时优先处理优先级高的块里的点就行了 ps:这题SPFA会TLE #include <iostream& ...
- [Usaco2011 Jan]道路和航线
Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...
- 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] ...
随机推荐
- Oracle 高水位说明和释放表空间,加快表的查询速度
高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...
- Confluence 6 诊断
当你对性能进行诊断或者希望知道是什么原因导致 Confluence 崩溃,你希望知道在 Confluence 内部是什么导致这些问题发生的.这个时候系统的诊断信息能够帮助你获得更多的有关的这些信息. ...
- Confluence 6 查看空间活动
空间活动信息是默认禁用(disabled by default)的.活动(Activity)的标没有显示,如果你的 Confluence Usage Stats 插件没有启用的.请查看下面的说明: ...
- Confluence 6 确定一个生产系统备份方案
Atlassian 推荐创建一个可选的数据库备份方案: 使用你数据库提供的备份和恢复工具 为了避免数据不完整和备份中断,我们推荐你在备份和恢复 Confluence 数据库的时候关闭 Confluen ...
- 【Java】SpringBoot配置文件读取中文乱码
[问题]在配置文件application.properties中配置一个值含有中文的变量.spring加载配置之后,读取的变量中文部分出现乱码.根据CSDN说的一堆办法,改encoding为UTF-8 ...
- HighCharts基本使用
一.简叙 HighCharts是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...
- JSP Filters(过滤器)
Filter是拦截Request请求的对象:在用户的请求访 问资源前处理ServletRequest以及ServletResponse,它可 用于日志记录.加解密.Session检查.图像文件保护 等 ...
- poj2417 bsgs算法非逆元模板,用于求解A^x=B(mod C)的方程
参考博客 https://blog.csdn.net/clover_hxy/article/details/50683832关于欧拉定理推论的证明 https://www.cnblogs.com/as ...
- 一道面试题 vuex缺点?
最近去面试的时候,面试官有一道题是让我阐述用vuex的优缺点,优点倒还好说,这个缺点还真没有认识到,有道友可以帮忙解惑嘛? 2 回答 慕标5265247 这种问题一般都有通用回答套路.一件挺好的东西, ...
- Python推荐系统库--Surprise实战
一.使用movieLens数据集 from surprise import KNNBasic, SVD from surprise import Dataset from surprise impor ...