1843: Jumping monkey
#include<iostream>
#include<string.h>
#include<map>
#include<queue>
using namespace std;
deque<int> que,ans;
int num[1<<21],fa[1<<21];
int n,m,nxt[21];
bool v[1<<21];
int main()
{
while(~scanf("%d%d",&n,&m) && n)
{
bool flag=0; int l=1<<n;
for(int i=0;i<l;i++) v[i]=fa[i]=0;
memset(nxt,0,sizeof(nxt));
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
nxt[u]|=(1<<v);
nxt[v]|=(1<<u);
}
if (m>n-1)
{
puts("Impossible");
continue;
}
v[(1<<n)-1]=1;
que.clear();
que.push_back((1<<n)-1);
while (!que.empty() && !flag)
{
int cur=que.front();
que.pop_front();
for(int i=0;i<n;i++)
{
int next=0;
if (cur&(1<<i))
{
for(int j=0;j<n;j++)
if ((cur&(1<<j)) && j!=i) next|=nxt[j];
if (!v[next])
{
v[next]=1;
num[next]=i;
fa[next]=cur;
que.push_back(next);
if (!next) {flag=1;break;}
}
}
}
}
if (flag)
{
ans.clear();
for(int cur=0;fa[cur];cur=fa[cur])
ans.push_back(num[cur]);
printf("%d: ",ans.size());
for(int i=ans.size()-1;i>=0;i--)
printf("%d%c",ans[i],!i? '\n':' ');
} else puts("Impossible");
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int cost[128][128],sz,dp[210][210][26],n,m,len;
char sym[26],ch[128][128],str[210];
bool first;
int main(){
ios_base::sync_with_stdio(false);
while(cin>>n&&n){
if(first)
cout<<endl;
else
first=true;
for(int i=0;i<n;++i)
cin>>sym[i];
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cin>>cost[sym[i]][sym[j]]>>ch[sym[i]][sym[j]]>>ch[sym[i]][sym[j]];
cin>>m;
while(m--){
memset(dp,-1,sizeof dp);
cin>>str;
len=strlen(str);
for(int i=0;i<len;++i)
dp[i][i][str[i]]=0;
for(int length=2;length<=len;++length)
for(int i=0,j=length-1;j<len;++i,++j)
for(int k=i;k<j;++k)
for(int le=0;le<n;++le)
if(dp[i][k][sym[le]]!=-1)
for(int ri=0;ri<n;++ri)
if(dp[k+1][j][sym[ri]]!=-1)
if(dp[i][j][ch[sym[le]][sym[ri]]]==-1||dp[i][j][ch[sym[le]][sym[ri]]]>dp[i][k][sym[le]]+dp[k+1][j][sym[ri]]+cost[sym[le]][sym[ri]])
dp[i][j][ch[sym[le]][sym[ri]]]=dp[i][k][sym[le]]+dp[k+1][j][sym[ri]]+cost[sym[le]][sym[ri]];
int ans=-1;
for(int i=0;i<n;++i)
if(dp[0][len-1][sym[i]]!=-1)
ans=(ans==-1?i:(dp[0][len-1][sym[i]]<dp[0][len-1][sym[ans]]?i:ans));
cout<<dp[0][len-1][sym[ans]]<<'-'<<sym[ans]<<endl;
}
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node{
int x,y,z;
node(){}
node(int X,int Y,int Z){x=X;y=Y;z=Z;}
bool operator==(const node P)const{
return x==P.x&&y==P.y&&z==P.z;
}
}p[5];
int Cross(int i,int j,int k){
node v1(p[i].x-p[k].x,p[i].y-p[k].y,p[i].z-p[k].z),v2(p[j].x-p[k].x,p[j].y-p[k].y,p[j].z-p[k].z);
return (v1.y*v2.z-v1.z*v2.y)+(v1.z*v2.x-v1.x*v2.z)+(v1.x*v2.y-v1.y*v2.x);
}
bool check(int i,int j,int k){
node v1(p[k].x-p[i].x,p[k].y-p[i].y,p[k].z-p[i].z),v2(p[k].x-p[j].x,p[k].y-p[j].y,p[k].z-p[j].z);
if((v1.x==0&&v2.x!=0)||(v1.x!=0&&v2.x==0)) return 0;
if((v1.y==0&&v2.y!=0)||(v1.y!=0&&v2.y==0)) return 0;
if((v1.z==0&&v2.z!=0)||(v1.z!=0&&v2.z==0)) return 0;
if(v1.x*v2.x>0||v1.y*v2.y>0||v1.z*v2.z>0) return 0;
if(v1.x==0&&v1.y==0&&v1.z==0) return 0;
if(v1.x!=0&&v1.y!=0&&v1.x*v2.y!=v1.y*v2.x) return 0;
if(v1.x!=0&&v1.z!=0&&v1.x*v2.z!=v1.z*v2.x) return 0;
if(v1.y!=0&&v1.z!=0&&v1.y*v2.z!=v1.z*v2.y) return 0;
return 1;
}
int main(){
while(~scanf("%d%d%d",&p[0].x,&p[0].y,&p[0].z),p[0].x||p[0].y||p[0].z){
for(int i=1;i<4;i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
if(p[0]==p[1]&&p[1]==p[2]) {
printf("%s\n",p[3]==p[0]?"YES":"NO");
continue;
}
int area=abs(Cross(0,1,2));
if(area==0){
if(p[0]==p[1]||p[0]==p[2]||p[1]==p[2]) {
bool flag;
if(p[0]==p[1]) flag=check(0,2,3);
else if(p[0]==p[2]) flag=check(0,1,3);
else flag=check(1,2,3);
printf("%s\n",flag?"YES":"NO");
}
else printf("%s\n",(check(0,1,3)||check(0,2,3)||check(1,2,3))?"YES":"NO");
}
else{
int area1=abs(Cross(0,1,3));
int area2=abs(Cross(0,2,3));
int area3=abs(Cross(1,2,3));
if(area1>0&&area2>0&&area3>0&&area==area1+area2+area3) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
using ll = long long;
const int maxn = 1e3 + 9;
typedef vector<ll> vec;
typedef vector<vec> mat;
ll n, M = 1e9;
vec mul(mat &A, vec &B)
{
vec C(A.size());
for (int i = 0; i<A.size(); i++)
for (int j = 0; j<B.size(); j++){
C[i] = (C[i] + A[i][j] * B[j]);
}
return C;
}
int main()
{
while (cin >> n){
if (n == 0)break;
mat A(n, vec(n)), B(n, vec(n));
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
cin >> A[i][j];
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
cin >> B[i][j];
vec H(n), TE(n);
for (int i = 0; i<n; i++){
H[i] = i + 1;
TE[i] = i + 1;
}
H = mul(A, H);
H = mul(A, H);
TE = mul(B, TE);
int f = 1;
for (int i = 0; i<n; i++){
if (TE[i] != H[i])
f = 0;
}
if (f)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}