标签:acm memset station course print set chmod perm pac
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8103 Accepted Submission(s): 2642
1 //2017-08-19 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int N = 15; 10 const int INF = 0x3f3f3f3f; 11 int G[N][N], n, m, pow3[N], dp[N][60000];//dp[i][S]表示到达节点i,状态为S时的最小费用 12 13 //询问节点i在状态S下经过了几次。将状态压缩为一个三进制数。 14 int query(int i, int S){ 15 return (S/pow3[i])%3; 16 } 17 18 int main() 19 { 20 //预处理3的次方,pow3[n]表示3的n次方。 21 pow3[0] = 1; 22 for(int i = 1; i < N; i++) 23 pow3[i] = pow3[i-1]*3; 24 while(scanf("%d%d", &n, &m)!=EOF){ 25 int u, v, w; 26 memset(G, INF, sizeof(G)); 27 memset(dp, INF, sizeof(dp)); 28 for(int i = 0; i < m; i++){ 29 scanf("%d%d%d", &u, &v, &w); 30 u--; v--;//节点从0到n-1编号。 31 G[u][v] = G[v][u] = min(G[u][v], w);//去重边 32 } 33 //初始化dp,因为每一个点都可以作为起点,所以到达i节点1次的最小费用为0。 34 for(int i = 0; i < n; i++) 35 dp[i][pow3[i]] = 0; 36 int ans = INF; 37 for(int S = 0; S < pow3[n]; S++){ 38 bool fg = true; 39 for(int i = 0; i < n; i++){ 40 //检查是否每个节点都已经经过 41 if(query(i, S) == 0){ 42 fg = false; 43 continue; 44 } 45 //转移到下一个节点 46 for(int v = 0; v < n; v++){ 47 if(query(v, S) == 2) 48 continue; 49 dp[v][S+pow3[v]] = min(dp[v][S+pow3[v]], dp[i][S]+G[i][v]); 50 } 51 } 52 if(fg){ 53 for(int i = 0; i < n; i++) 54 ans = min(ans, dp[i][S]); 55 } 56 } 57 if(ans == INF)printf("-1\n"); 58 else printf("%d\n", ans); 59 } 60 61 return 0; 62 }
标签:acm memset station course print set chmod perm pac
原文地址:http://www.cnblogs.com/Penn000/p/7398063.html