您的位置:首页 > Web前端

洛谷P1821 [USACO07FEB]Silver Cow Party S

2020-07-20 04:20 1271 查看

反向建边,参照我的博客食用更佳

博客传送门

问题传送门

code:

[code]#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e7;
int cnt,n,m,x;
int head
,rhead
,dis
,rdis
,vis
,sum
;
struct Edge{
int to,next,dist;
}e
;
struct node{
int u,dist;
node(int u,int dist):u(u),dist(dist){}
bool operator < (const node&rhs) const{
return dist>rhs.dist;
}
};
void addEdge(int u,int v,int w){
e[++cnt].to=v;
e[cnt].dist=w;
e[cnt].next=head[u];
head[u]=cnt;
//反向建边
e[++cnt].to=u;
e[cnt].dist=w;
e[cnt].next=rhead[v];
rhead[v]=cnt;
}
void dijkstra(){
for(int i=1;i<=n;i++){
dis[i]=1e9;
}
memset(vis,0,sizeof(vis));
priority_queue<node> q;
q.push(node(x,0));
dis[x]=0;
while(!q.empty()){
node t=q.top();
q.pop();
int u=t.u,dist=t.dist;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,w=e[i].dist;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(node(v,dis[v]));
}
}
}
}
void rdijkstra(){
for(int i=1;i<=n;i++){
rdis[i]=1e9;
}
memset(vis,0,sizeof(vis));
priority_queue<node> q;
q.push(node(x,0));
rdis[x]=0;
while(!q.empty()){
node t=q.top();
q.pop();
int u=t.u,dist=t.dist;
if(vis[u]) continue;
vis[u]=1;
for(int i=rhead[u];i;i=e[i].next){
int v=e[i].to,w=e[i].dist;
if(rdis[v]>rdis[u]+w){
rdis[v]=rdis[u]+w;
q.push(node(v,rdis[v]));
}
}
}
}
bool cmp(int x,int y){
return x>y;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>x;
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
addEdge(u,v,w);
}
dijkstra();
rdijkstra();
for(int i=1;i<=n;i++){
dis[i]+=rdis[i];
}sort(dis+1,dis+1+n,cmp);
cout<<dis[1]<<endl;
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: