计蒜客 28202. Failing Components-最短路(Dijkstra) (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 B)

时间:2023-03-10 08:21:10
计蒜客 28202. Failing Components-最短路(Dijkstra)  (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 B)

B. Failing Components

传送门

题意就是单向图,从起点开始找最短路,然后统计一下个数就可以。方向是从b到a,权值为s。

直接最短路跑迪杰斯特拉,一开始用数组版的没过,换了一个队列版的过了。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
const double eps=1e-;
const int N=1e5+;
const int INF=0x3f3f3f3f;
int head[N*], nex[N*], to[N*], val[N*], dis[N], vis[N], tot;
struct cmp{
bool operator()(int a,int b) {
return dis[a]>dis[b];
}
};
priority_queue<int, vector<int>, cmp > Q;
void init() {
tot = ;
while(!Q.empty()) Q.pop();
memset(head, -, sizeof(head));
memset(dis, INF, sizeof(dis));
memset(vis, , sizeof(vis));
}
void addedge(int u, int v, int w) {
to[tot] = v;
nex[tot] = head[u];
val[tot] = w;
head[u] = tot++;
}
void Dijkstra(int S) {
Q.push(S);
dis[S] = ;
while(!Q.empty()) {
int u = Q.top();
Q.pop();
for(int i=head[u]; i!=-; i=nex[i]) {
int v = to[i];
if(!vis[v] && dis[u]+val[i] < dis[v]) {
dis[v] = dis[u]+val[i];
Q.push(v);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
init();
int n,p,k;
scanf("%d%d%d",&n,&p,&k);
int h,l,val;
for(int i=;i<p;i++){
scanf("%d%d%d",&h,&l,&val);
addedge(l,h,val);
}
Dijkstra(k);
int num=;
int maxx=-;
for(int i=;i<=n;i++){
if(dis[i]!=INF){
num++;
maxx=max(maxx,dis[i]);
}
}
cout<<num<<" "<<maxx;
cout<<endl;
}
return ;
}