题意不是问最短路有多少条,而是问从下一个点出发有多少条路比从当前点出发到2(终点)要短?? 最短路算法方面是直接套用的模板,不过这次不是先求终点到各点的最短路,再从源点进行搜索。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
const int N=1100;
const int INF=0x3f3f3f3f;
struct node
{
int u,d;
int operator<(const node x)const
{
return x.d<d;
}
};
struct maps
{
int v,w;
}edge[N*N];
vector<int> g[N];
int n,s,cnt,d[N],dp[N];
void init()
{
for(int i=0;i<N;i++)
{
g[i].clear();
d[i]=INF;
}
cnt=0;
memset(dp,0,sizeof(dp));
}
void add(int u,int v,int w)
{
edge[cnt].v=v,edge[cnt].w=w;
g[u].push_back(cnt++);
}
void dijstar(int s)
{
priority_queue<node> q;
node cur,next;
cur.u=s,cur.d=0;
d[s]=0;
q.push(cur);
maps e;
int i,u;
while(!q.empty())
{
cur=q.top();
q.pop();
u=cur.u;
if(d[u]!=cur.d) continue;
for(i=0;i<g[u].size();i++)
{
e=edge[g[u][i]];
if(d[e.v]>d[u]+e.w)
{
d[e.v]=d[u]+e.w;
next.u=e.v,next.d=d[e.v];
q.push(next);
}
}
}
}
int dfs(int u)
{
if(u==2) return 1;
if(dp[u]) return dp[u];
int tmp=0;
for(int i=0;i<g[u].size();i++)
{
int v=edge[g[u][i]].v;
if(d[v]<d[u])
{
tmp+=dfs(v);
}
}
dp[u]=tmp;
return dp[u];
}
int main()
{
int m,i,u,v,w;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d",&m);
init();
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dijstar(2);
printf("%d\n",dfs(1));
}
return 0;
}