UVA-140 最小頻寬 以後再補吧
阿新 • • 發佈:2019-02-20
夭折的一題,應該用set來儲存節點的
可參考程式碼連結
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
#define DEBUG
const int maxn=1000+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;
char s[maxn];
int A[30],B[30],flow;
int buf[30][30];
int cnt=0,visited[30];
void dfs(int cur,int cnt,int* A){
if(cur==cnt){
int temp=0;
// printf("+++++++++fuck%d\n",flow);
for(int i=0;i<cnt;i++){
for (int j=i;j<cnt;j++){
if(buf[A[i]][A[j]])
temp=max(temp,j-i);
}
}
if(temp<flow){
for(int i=0;i<cnt;i++)B[i]=A[i];
// printf("%d\n",flow);
flow=temp;
// printf("---------fuck%d\n",flow);
}
else{
// printf("????\n");
}
}
for(int i=0;i<cnt;i++){
if(visited[i])continue;
int flag=1;
for(int j=0;j<cur;j++){
if(buf[A[j]][i]&&cur-j>=flow){flag=0;break;}
}
if(!flag)continue;
visited[i]=1;
A[cur]=i;
dfs(cur+1,cnt,A);
visited[i]=0;
}
}
int main(){
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
while(cin.getline(s,1000),s[0]!='#'){
int len=strlen(s);
int cnt=0;
memset(buf,0,sizeof(buf));
memset(visited,0,sizeof(visited));
for(int i=0;i<len;i++){
if(s[i]==':'){
int t;
for(int j=i-1;j>=0;j--)if(s[j]>='A'&&s[j]<='Z'){t=s[j]-'A';break;}
if(!visited[t]){visited[t]=1;cnt++;}
for(int j=i+1;s[j]!=';'&&j<len;j++){
// v[t].push_back(s[j]-'A');
int tt;
if(s[j]>='A'&&s[j]<='Z'){tt=s[j]-'A';}
else continue;
if(!visited[tt]){visited[tt]=1;cnt++;}
// printf("%d %d\n",t,tt );
buf[t][tt]=1;
buf[tt][t]=1;
}
}
}
memset(visited,0,sizeof(visited));
flow=cnt;
dfs(0,cnt,A);
for(int i=0;i<cnt;i++)printf("%c ",B[i]+'A');
// for(int i=0;i<26;i++){
// for(int j=0;j<26;j++)
// printf("%d ",buf[i][j]);
// printf("\n");
// }
printf("-> %d\n",flow);
}
#ifdef DEBUG
fclose(stdin);
fclose(stdout);
#endif
return 0;
}