1. 程式人生 > >UVA-140 最小頻寬 以後再補吧

UVA-140 最小頻寬 以後再補吧

夭折的一題,應該用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; }