标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6935 Accepted Submission(s): 2548
/* ID: LinKArftc PROG: 1142.cpp LANG: C++ */ #include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <string> #include <utility> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define randin srand((unsigned int)time(NULL)) #define input freopen("input.txt","r",stdin) #define debug(s) cout << "s = " << s << endl; #define outstars cout << "*************" << endl; const double PI = acos(-1.0); const double e = exp(1.0); const int inf = 0x3f3f3f3f; const int INF = 0x7fffffff; typedef long long ll; const int maxn = 1010; int n, m; int mp[maxn][maxn]; int dis[maxn]; bool vis[maxn]; void dij(int s) { for (int i = 1; i <= n; i ++) dis[i] = mp[s][i]; memset(vis, 0, sizeof(vis)); vis[s] = true; dis[s] = 0; for (int i = 2; i <= n; i ++) { int mi = inf; int ii = s;//要赋值,因为下一行的for循环可能并不改变ii的值,所以可能会RE for (int j = 1; j <= n; j ++) { if (!vis[j] && dis[j] < mi) { mi = dis[j]; ii = j; } } vis[ii] = true; for (int j = 1; j <= n; j ++) { if (!vis[j] && dis[j] > dis[ii] + mp[ii][j]) { dis[j] = dis[ii] + mp[ii][j]; } } } } int cnt[maxn]; int dfs(int cur) { if (cnt[cur]) return cnt[cur]; if (cur == 2) return 1; int ret = 0; for (int i = 1; i <= n; i ++) { if (mp[cur][i] == inf || dis[i] >= dis[cur]) continue; ret += dfs(i); } cnt[cur] = ret; return ret; } int main() { //input; int u, v, c; while (~scanf("%d", &n) && n) { scanf("%d", &m); memset(mp, 0x3f, sizeof(mp)); for (int i = 1; i <= m; i ++) { scanf("%d %d %d", &u, &v, &c); mp[u][v] = c; mp[v][u] = c; } dij(2); //for (int i = 1; i <= n; i ++) printf("dis[%d] = %d\n", i, dis[i]); memset(cnt, 0, sizeof(cnt)); printf("%d\n", dfs(1)); } return 0; }
HDU1142 A Walk Through the Forest
标签:
原文地址:http://www.cnblogs.com/LinKArftc/p/4904714.html