題目可以轉換為1-n的一條最短路,題目的限制,可以理解為n個結點,1的出度為1,n的入度為1,其他點出度等於入度,1代表選這條邊,0代表不選,這樣就相當於求1-n的最短路。。Orz 神轉換。
但是問題在於,除了1-n的最短路,還有1種情況滿足條件,那就是,1-1轉一個環,n-n轉一個環,這樣也滿足3條限制,所以答案必須是這兩種情況的最小值。
#include#include #include #include #include #include #include using namespace std; #define INF 0x3f3f3f3f int d[305]; int n; int v[305]; int g[305][305]; void spfa(int st) { int i,u; queue Q; memset(v,0,sizeof(v)); d[st]=INF; for(i=1;i<=n;i++) { if(i!=st) { v[i]=1; d[i]=g[st][i]; Q.push(i); } } while(!Q.empty()) { u=Q.front();Q.pop(); v[u]=0; for(i=1;i<=n;i++) { if(d[u]+g[u][i]