标签:acm c++ dijkstra codeforces
#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
#include <climits>
#include <algorithm>
#define N 100010
const int INF=INT_MAX;
using namespace std;
struct edge
{
int from,to,c;
edge(int a,int b)
{
to=a,c=b;
}
edge()
{
from=0,to=0,c=0;
}
};
edge e[N];
typedef pair<int,int> p;
int V;
vector <edge> G[N*2];
int d[N];
void dijkstra(int s)
{
priority_queue<p,vector<p>,greater<p> > que;
fill(d+1,d+V+1,INF);
d[s]=0;
que.push(p(0,s));
while(!que.empty())
{
p pp=que.top();que.pop();
int v=pp.second;
if(d[v]<pp.first) continue;
for(int i=0;i<G[v].size();i++){
edge e=G[v][i];
if(d[e.to]>d[v]+e.c)
{
d[e.to]=d[v]+e.c;
que.push(p(d[e.to],e.to));
}
}
}
}
int main()
{
int m,l,s;
int ans=0;
scanf("%d%d%d",&V,&m,&s);
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(edge(b,c));
G[b].push_back(edge(a,c));
e[i].from=a,e[i].to=b,e[i].c=c;
}
scanf("%d",&l);
dijkstra(s);
for(int i=0;i<m;i++)
{
int u=e[i].from,v=e[i].to,cost=e[i].c;
if(d[u]<l && l-d[u]<cost && d[v]+cost-(l-d[u])>l) ans++;
if(d[v]<l && l-d[v]<cost && d[u]+cost-(l-d[v])>l) ans++;
if(d[u]<l && d[v]<l && d[u]+d[v]+cost==2*l) ans++;
}
for(int i=1;i<=V;i++)
if(d[i]==l) ans++;
cout<<ans<<endl;
return 0;
}Codeforces 144D. Missile Silos【dijkstra】
标签:acm c++ dijkstra codeforces
原文地址:http://blog.csdn.net/u013912596/article/details/38959971