为毛我这代码跑了453ms - -!
坑爹的一道题,我看清了题目是要求一条渐进于终点的路径,但没想到其中任意两点之间都必须存在一条道路,你妹。。脑残了
根据题目描述,若a能走到b,则应满足a到house的最短路长度大于b到house的最短路长度
dijkstra+记忆化搜索
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int maxN=1010;
const int inf=~0U>>1;
struct Edge{
int w,next;
Edge(int _w,int _next):w(_w),next(_next){}
};
vector<Edge> e[maxN];
int d[maxN],r[maxN];
bool done[maxN];
int dp(int u){
if(r[u]) return r[u];
int res=0;
for(vector<Edge>::iterator it=e[u].begin();it!=e[u].end();++it)
if(d[it->next]<d[u])
res+=dp(it->next);
return r[u]=res;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
#endif
int n,m;
while(cin>>n,n){
cin>>m;
for(int i=1;i<=n;++i)
e[i].clear();
while(m--){
int a,b,w;
cin>>a>>b>>w;
e[a].push_back(Edge(w,b));
e[b].push_back(Edge(w,a));
}
fill(d,d+maxN,inf);
fill(done,done+maxN,false);
d[2]=0;
priority_queue<pair<int,int> > q;
q.push(make_pair(-d[2],2));
while(!q.empty()){
int u=q.top().second;q.pop();
if(done[u]) continue;
done[u]=true;
for(vector<Edge>::iterator it=e[u].begin();it!=e[u].end();++it){
if(d[it->next]>d[u]+it->w){
d[it->next]=d[u]+it->w;
q.push(make_pair(-d[it->next],it->next));
}
}
}
fill(r,r+maxN,0);
r[2]=1;
cout<<dp(1)<<endl;
}
return 0;
}