第四专题 Problem J
来源:互联网 发布:客厅电脑主机 知乎 编辑:程序博客网 时间:2024/05/23 19:20
5 61 3 21 4 23 4 31 5 124 2 345 2 247 81 3 11 4 13 7 17 4 17 5 16 7 15 2 16 2 10
24
思路:
用spfa求出2到各个点之间的距离,然后从1找出有多少条可以到2的点。同时用到了深搜
源码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
const int M = 1007;
const int INF = 0x3f3f3f3f;
using namespace std;
int map[M][M], d[M], ans[M];
int n, m;
bool vis[M];
void spfa(int u){
for(int i = 1; i <= n; ++ i){
d[i] = INF; vis[i] = 0;
}
vis[u] = 1; d[u] = 0;
queue<int > q;
q.push(u);
while(!q.empty()){
int temp = q.front(); q.pop(); vis[temp] = 0;
for(int i = 1; i <= n; ++ i){
if(d[i] > d[temp]+map[temp][i]){
d[i] = d[temp]+map[temp][i];
if(!vis[i]){
vis[i] = 1;
q.push(i);
}
}
}
}
}
int dfs(int u){
if(ans[u] != -1) return ans[u];
if(u == 2) return 1;
ans[u] = 0;
for(int i = 1; i <= n; ++ i){
if(map[u][i] != INF&&d[i] < d[u]){
ans[u] += dfs(i);
}
}
return ans[u];
}
int main(){
while(scanf("%d", &n), n){
scanf("%d", &m);
for(int i = 0; i <= n; ++ i){
for(int j = 0; j <= n; ++ j){
map[i][j] = (i == j?0:INF);
}
}
int a, b, c;
for(int i = 0; i < m; ++ i){
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = min(c, map[a][b]);
}
spfa(2);
memset(ans, -1, sizeof(ans));
printf("%d\n", dfs(1));
}
}
- 第四专题 Problem J
- 专题三 Problem J
- 专题四 Problem J
- 第四专题 Problem C
- 第四专题 Problem E
- 第四专题 Problem F
- 第四专题 Problem K
- 2013 - ECJTU 暑期训练赛第四场-problem-J
- Problem J
- Problem J
- Problem J
- Problem-J
- Problem J
- Problem-J
- Problem J
- problem j
- Problem D & Problem J
- 1010-J专题三
- Android开源代码汇总
- jQuery函数的第二个参数获取指定上下文中的DOM元素
- Eclipse快捷键和10个最有用的快捷键
- 134. Gas Station
- caffe源码阅读笔记(1):路线图
- 第四专题 Problem J
- 欢迎使用CSDN-markdown编辑器
- i2c驱动程序
- SpringBoot入门系列:第七篇 Spring Boot的测试
- phpmyadmin取消最大文件限制的更改解决方法
- git常用命令整理
- [Linux] NFSv4 and Autofs caveats
- IOS手势识别,捏合,旋转,轻扫等
- 异常值的观测