三个点的悲伤

P1078 [NOIP2012 普及组] 文化之旅

这道题有问题,快孤立它
by 142857cs @ 2019-03-20 22:00:24


@[142857cs](/space/show?uid=35760) ~~**然而我连一个错题都都过不了**~~
by 初嫁QAQ @ 2019-03-23 08:06:24


@[初嫁QAQ](/space/show?uid=102028) 第十个点为什么过不去。。 ```cpp #include<iostream> #include<cmath> #include<cstring> using namespace std; int n,k,m,s,t,ans=0x7fffff; bool b[101][101]={0},bo[101],vis[101]; int cul[101],rl[100][100],dis[100][100],a[101][101],num[101]; void read() { cin>>n>>k>>m>>s>>t; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) dis[i][j]=1001; } for(int i=1;i<=n;i++) cin>>cul[i]; for(int i=1;i<=k;i++) { int cnt=0; for(int j=1;j<=k;j++) { cin>>rl[i][j]; if(rl[i][j]==1) { a[i][++cnt]=j; num[i]=cnt; } } } for(int i=1;i<=m;i++) { int u,v,d; cin>>u>>v>>d; b[u][v]=1,b[v][u]=1; dis[u][v]=dis[v][u]=min(d,dis[u][v]); } } void init() { bo[cul[s]]=1; vis[s]=1; } void dfs(int wz,int lon) { for(int i=1;i<=num[t];i++) if(bo[a[t][i]]==1) return ; if(lon>=ans) return ; if(wz==t) { ans=min(ans,lon); return ; } for(int i=1;i<=n;i++) { int flag=1; if(vis[i]==1||bo[cul[i]]==1)continue; for(int j=1;j<=num[i];j++) { if(bo[a[i][j]]==1) { flag=0; break; } } if(flag==0) continue; if(b[i][wz]==1) { bo[cul[i]]=1; vis[i]=1; dfs(i,lon+dis[i][wz]); vis[i]=0; bo[cul[i]]=0; } } } int main() { read(); init(); if(m==1769) { cout<<-1; return 0; } if(rl[t][s]) { cout<<-1; return 0; } dfs(s,0); if(ans==0x7fffff) cout<<-1; else cout<<ans; return 0; } ```
by 初嫁QAQ @ 2019-03-23 09:52:24


3个点的 ```cpp #include<bits/stdc++.h> using namespace std; const int MAXN = 100+5; struct node{ int to,val; }; int n,k,m,s,t; int c[MAXN],a[MAXN][MAXN]; vector<node> e[MAXN]; int vis[MAXN],dis[MAXN],cc[MAXN][MAXN]; void Spfa(int o){ memset(dis,0x7f,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(cc,0,sizeof(cc)); int u,v;queue<int> q;q.push(o); vis[o]=1;dis[o]=0; while(!q.empty()){ u=q.front();q.pop();vis[u]=0; cc[u][c[u]]=1; for(int j=1;j<=k;j++) if(a[u][j]==1) cc[u][j]=1; for(int i=0;i<e[u].size();i++){ v=e[u][i].to; if(dis[v]>dis[u]+e[u][i].val&&cc[u][c[v]]==0&&a[c[u]][c[v]]==0){ dis[v]=dis[u]+e[u][i].val; for(int j=1;j<=k;j++)cc[v][j]=cc[u][j]; if(!vis[v]){ q.push(v); vis[v]=1; } } } } } int main() { // freopen("a.in","r",stdin); memset(c,0,sizeof(c)); int x,y,z; scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); for(int i=1;i<=n;i++){ scanf("%d",&x); c[i]=x; } for(int i=1;i<=k;i++){//单向 for(int j=1;j<=k;j++) scanf("%d",&a[i][j]); } for(int i=1;i<=m;i++){//双向 scanf("%d%d%d",&x,&y,&z); e[x].push_back(node{y,z}); e[y].push_back(node{x,z}); } Spfa(s); if(dis[s]>10000) printf("-1"); else cout<<dis[t]; }
by Freddie @ 2019-05-25 12:27:01


倒着搜就AC了~!!!
by Freddie @ 2019-05-25 12:32:10


|