社区讨论
求条闭关
P3008[USACO11JAN] Roads and Planes G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mk7vow7g
- 此快照首次捕获于
- 2026/01/10 13:42 上个月
- 此快照最后确认于
- 2026/01/12 21:10 上个月
50pts
CPP#include<bits/stdc++.h>
//因为爱,所以坚持
using namespace std;
#define int long long
const int INF = 0x3f3f3f3f;
struct edge{
int v,next,w;
}ed[200050];
struct node{
int d,u;
bool operator < (const node& nod) const {
return d > nod.d;
}
};
int n,r,p,s,head[100050],tot,cnt,bl[100050],ok[100050],d[100050];
bool vis[100050];
vector<int> es[100050];
void add(int u, int v, int w){
ed[tot].v = v;
ed[tot].w = w;
ed[tot].next = head[u];
head[u] = tot++;
}
void dfs(int u){
vis[u] = 1;
bl[u] = cnt;
es[cnt].push_back(u);
for(int i = head[u];i != -1;i = ed[i].next){
int v = ed[i].v;
if(vis[v]) continue;
dfs(v);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>p>>r>>s;
memset(head,-1,sizeof(head));
for(int i = 1,a,b,c;i <= r;i++){
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
for(int i = 1;i <= n;i++){
if(!vis[i]){
cnt++;
dfs(i);
}
}
for(int i = 1,a,b,c;i <= p;i++){
cin>>a>>b>>c;
add(a,b,c);
++ok[bl[b]];
}
memset(d,0x7f,sizeof(d));
memset(vis,0,sizeof(vis));
d[s] = 0;
queue<int> Q;
Q.push(bl[s]);
for(int i = 1;i <= cnt;i++) if(!ok[i]) Q.push(i);
priority_queue<node> q;
while(!Q.empty()){
int xi = Q.front();
Q.pop();
for(auto u : es[xi]) q.push(node{d[u],u});
while(!q.empty()){
node now = q.top();
q.pop();
int u = now.u;
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u];i != -1;i = ed[i].next){
int v = ed[i].v;
if(d[v] > d[u]+ed[i].w) {
d[v] = d[u]+ed[i].w;
if(bl[v] == bl[u]) q.push(node{d[v],v}) ;
}
if(bl[v] != bl[u] && (--ok[bl[v]]) == 0) Q.push(bl[v]);
}
}
}
for(int i = 1;i <= n;i++){
if(d[i] > INF) cout<<"NO PATH"<<endl;
else cout<<d[i]<<endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...