标签:des style blog io color ar os java sp
2 5 6 1 2 2 4 1 3 3 5 4 3 4 5 2 1 1 2
Case 1: JYY has to use 3 balls. Case 2: Poor JYY.
题意:让找到一个环使得组成环的点数为奇数且点数至少为3,。
因为一个点可以多个途径到达,但从一点出发第一次到达的肯定是最短路径,又题目要求的奇偶性,每次到达一个点步数的奇偶性进行标记。
#include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<vector> using namespace std; #define N 1005 #define ll __int64 const int inf=0x7fffffff; vector<int>g[N]; int vis[N][2]; struct node { int u,t; friend bool operator<(node a,node b) { return a.t>b.t; } }; int bfs(int s) { int i,u,v; priority_queue<node >q; node cur,next; cur.u=s; cur.t=1; memset(vis,0,sizeof(vis)); vis[s][1]=1; //奇数点,用一个珠子 q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); u=cur.u; for(i=0;i<g[u].size();i++) { next.u=v=g[u][i]; next.t=cur.t+1; if(v==s&&next.t%2==0&&next.t>3) //结点处到达两次,故应该减一 return next.t-1; if(!vis[v][next.t%2]) { vis[v][next.t%2]=1; q.push(next); } } } return inf; } int main() { int i,n,m,u,v,tt,cnt=0; scanf("%d",&tt); while(tt--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) g[i].clear(); while(m--) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } int ans=inf; for(i=1;i<=n;i++) ans=min(ans,bfs(i)); if(ans==inf) printf("Case %d: Poor JYY.\n",++cnt); else printf("Case %d: JYY has to use %d balls.\n",++cnt,ans); } return 0; }
下面这种方法是用一个数组记录到达该点的步数,当再次访问该点时,说明出现环,直接判断奇偶性就可以了。
又要求所用珠子数目大于三,所以要用一个pre变量记录上一个节点的标号,判断是否是两点直接成环。
#include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<vector> using namespace std; #define N 1005 #define ll __int64 const int inf=0x7fffffff; vector<int>g[N]; int vis[N][2]; int ans; struct node { int u,t,pre; friend bool operator<(node a,node b) { return a.t>b.t; } }; int bfs(int s) { int i,u,v,t; priority_queue<node >q; node cur,next; cur.u=s; cur.t=1; cur.pre=-1; memset(vis,0,sizeof(vis)); vis[s][1]=1; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); u=cur.u; for(i=0;i<g[u].size();i++) { next.u=v=g[u][i]; next.t=cur.t+1; next.pre=u; if(v==cur.pre) continue; if(vis[v][0]) //偶数点 { t=cur.t+vis[v][0]; if(t%2==0) return t-1; } else if(vis[v][1]) { t=cur.t+vis[v][1]; if(t%2==0) return t-1; } else { vis[v][next.t%2]=next.t; q.push(next); } } } return inf; } int main() { int i,n,m,u,v,tt,cnt=0; scanf("%d",&tt); while(tt--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) g[i].clear(); while(m--) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } ans=inf; for(i=1;i<=n;i++) ans=min(ans,bfs(i)); if(ans==inf) printf("Case %d: Poor JYY.\n",++cnt); else printf("Case %d: JYY has to use %d balls.\n",++cnt,ans); } return 0; }
hdu 1689 Alien’s Necklace (bfs层次图剪枝)
标签:des style blog io color ar os java sp
原文地址:http://blog.csdn.net/u011721440/article/details/41048111