Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
果然是因为n=1的问题WA,真是坑#include <iostream> #include <stdio.h> using namespace std; int adjNum[11] = {0}; int adjList[11][11]; int adjCost[11][11]; int adjDisCost[11][11]; int adjDisArg[11][11]; int adjState[11] = {1, 0}; bool contain(int state, int bit){ return ((state & (1<<bit)) != 0); } void dfs(int lab, bool *used){ used[lab] = 1; for(int i = 0; i < adjNum[lab]; i++){ int tar = adjList[lab][i]; if(used[tar]) continue; dfs(tar, used); } } int main() { int cost[10][1024]; int n, m; scanf("%d%d", &n, &m); int n2 = (1 << n); for(int i = 0; i < n; i++){ for(int j = 1; j < n2; j+=2){ cost[i][j] = 10000000; } } cost[0][1] = 0; for(int i = 0; i < m; i++){ int from, to, pay, lowprice, price; scanf("%d%d%d%d%d", &from, &to, &pay, &lowprice, &price); from--, to--, pay--; if(from == to) continue; adjList[to][adjNum[to]] = from; adjCost[to][adjNum[to]] = price; adjDisCost[to][adjNum[to]] = lowprice; adjDisArg[to][adjNum[to]] = pay; adjState[to] += (1 << from); adjNum[to]++; } if(n == 1){ printf("0\n"); return 0; } bool used[11] = {0}; dfs(n-1, used); if(!used[0]){ printf("impossible\n"); return 0; } while(1){ bool ybd = 0; //cout << 1 << endl; for(int st = 1; st < n2; st += 2){ for(int p = 0; p < n; p++){ if(p == 0 && st == 1) continue; if(!contain(st, p) || ((st & adjState[p]) == 0)) continue; int mn = cost[p][st]; for(int i = 0; i < adjNum[p]; i++){ int v = adjList[p][i]; int c = adjCost[p][i]; int lc = adjDisCost[p][i]; int arg = adjDisArg[p][i]; int st_ = st - (1 << p); int tempD = cost[v][st] + (contain(st, arg) ? lc : c); if(tempD < mn){ ybd = 1; mn = tempD; } if(p != 0){ tempD = cost[v][st_] + (contain(st_, arg) ? lc : c); if(tempD < mn){ ybd = 1; mn = tempD; } } } cost[p][st] = mn; } } if(!ybd) break; } int minC = 10000000; for(int st = 1 + (1 << (n-1)); st < n2; st += 2){ if(cost[n-1][st] < minC) minC = cost[n-1][st]; } printf("%d\n", minC); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator