下面是spfa+dfs
//5601720 2012-03-21 20:40:48 Accepted 1142 31MS 624K 1382 B C++ zjwzcnjsy
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define inf 0x3fffffff
#define M 1001
struct son{
int v,w;
son(int tv,int tw):v(tv),w(tw){}
};
vector<son>g[M];
int n,m;
int dist[M],inq[M];
__int64 ans[M];;
void init(){
for(int i=0;i<=n;++i)g[i].clear(),ans[i]=-1;
}
void spfa(int u){
int i,v,w;
for(i=1;i<=n;++i)dist[i]=inf,inq[i]=0;
dist[u]=0;
queue<int>Q;
Q.push(u);inq[u]=1;
while(!Q.empty()){
u=Q.front();Q.pop();inq[u]=0;
for(i=0;i<g[u].size();++i){
v=g[u][i].v;w=g[u][i].w;
if(dist[v]>dist[u]+w){
dist[v]=dist[u]+w;
if(!inq[v]){Q.push(v);inq[v]=1;}
}
}
}
}
__int64 dfs(int i){/*dfs也要优化,不然也会超时*/
if(ans[i]!=-1)return ans[i];
if(i==2)return 1;
ans[i]=0;
for(int j=0;j<g[i].size();++j)
{
if(g[i][j].v!=i && dist[g[i][j].v]<dist[i]){
ans[i]+=dfs(g[i][j].v);
}
}
return ans[i];
}
int main()
{
int a,b,d,i;
while(scanf("%d",&n)!=EOF&&n){
scanf("%d",&m);
init();
for(i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&d);
g[a].push_back(son(b,d));
g[b].push_back(son(a,d));
}
spfa(2);
dfs(1);
printf("%I64d\n",ans[1]);
}
return 0;
}
下面是dijkstra+dfs
//5601763 2012-03-21 20:44:11 Accepted 1142 93MS 4156K 1317 B C++ zjwzcnjsy
#include <stdio.h>
#define inf 0x3fffffff
#define M 1001
int dist[M],map[M][M],n,m;
__int64 ans[M];
void init(){
for(int i=1;i<=n;++i){
ans[i]=-1;
for(int j=1;j<=n;++j)map[i][j]=(i==j?0:inf);
}
}
void dijkstra(int u){
int v[M],i,j,min,w;
for(i=1;i<=n;++i)dist[i]=map[u][i],v[i]=0;
dist[u]=0;v[u]=1;
for(i=0;i<n;i++){
min=inf;
for(j=1;j<=n;++j){
if(!v[j] && dist[j]<min){min=dist[j];w=j;}
}
v[w]=1;
for(j=1;j<=n;++j){
if(!v[j] && dist[j]>dist[w]+map[w][j]){dist[j]=dist[w]+map[w][j];}
}
}
}
__int64 dfs(int i){/*dfs也要优化,不然也会超时*/
if(ans[i]!=-1)return ans[i];
if(i==2)return 1;
ans[i]=0;
for(int j=1;j<=n;++j)
{
if(i!=j && dist[j]<dist[i] && map[i][j]<inf){
ans[i]+=dfs(j);
}
}
return ans[i];
}
int main()
{
int a,b,d,i;
while(scanf("%d",&n)!=EOF&&n){
scanf("%d",&m);
init();
for(i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&d);
if(map[a][b]>d)map[a][b]=map[b][a]=d;
}
dijkstra(2);
dfs(1);
printf("%I64d\n",ans[1]);
}
return 0;
}