Bandwidth UVA - 140

題目鏈接

思路:

  1. next_permutation()+判斷
  2. dfs+剪枝

C++代碼

next_permutation()+判斷:

#include<bits/stdc++.h>
using namespace std;
const int maxn=30;

int G[maxn][maxn],used[maxn],str[maxn],ans[maxn];
int main(){
    string s;
    while(getline(cin,s)){
        memset(G,0,sizeof(G));
        memset(used,0,sizeof(used));
        if(s[0]=='#')   break;
        int a,b;
        for(int i=0;i<s.length();i++){
            b=s[i]-'A';
            if(s[i]==':')   a=s[i-1]-'A';
            if(isalpha(s[i])&&s[i+1]!=':')  G[a][b]=G[b][a]=1,used[a]=used[b]=1;        
        }
        int size=0;
        for(int i=0;i<maxn;i++)
            if(used[i])
                str[size++]=i;
        int mind=0x7777777,maxd;
        do{
            maxd=0;
            for(int i=0;i<size;i++)
                for(int j=0;j<i;j++)
                    if(G[str[i]][str[j]]&&maxd<i-j)
                        maxd=i-j;
            if(mind>maxd){
                mind=maxd;
                for(int i=0;i<size;i++)
                    ans[i]=str[i];
            }
        }while(next_permutation(str,str+size));
        for(int i=0;i<size;i++)     printf("%c ",ans[i]+'A');
        printf("-> %d\n",mind);
    }
    return 0;
}

dfs+剪枝:

#include <bits/stdc++.h>  
using namespace std;  

char buf[99], link[8][8], used[26], save[8], ans[8], str[8];  

int  maxbandwidths;  
void dfs(int d,int n)  
{  
    if (d==n) {  
        int max = 0;  
        for (int i = 0; i < d; ++ i)   
            for (int j = 0; j < i; ++ j)  
                if (link[save[j]][save[i]] && max < i-j)  
                    max = i-j;  
        if (maxbandwidths > max) {  
            maxbandwidths = max;  
            for (int j = 0; j < d; ++ j)  
                ans[j] = save[j];  
        }                 
    }  
    for (int i = 0; i < n; ++ i)  
        if (!used[i]) {  
            used[i] = 1;  
            save[d] = str[i];  
            dfs(d+1, n);  
            used[i] = 0;  
        }  
}  

int main()  
{  
    while (~scanf("%s",buf) && buf[0] != '#') {  
        int v, u;  
        memset(link, 0, sizeof(link));  
        memset(used, 0, sizeof(used));  
        for (int i = 0; buf[i]; ++ i) {  
            if (buf[i]==':') v = buf[i-1]-'A';  
            if (buf[i+1]!=':'&&isalpha(buf[i])){  
                u = buf[i]-'A';  
                link[v][u] = link[u][v] = 1;  
                used[u] = used[v] = 1;  
            }  
        }  
        int size = 0;  
        for (int i = 0; i < 26; ++ i)  
            if (used[i]) {  
                str[size ++] = i;  
                used[i] = 0;  
            }  

        maxbandwidths = 8;  
        dfs(0, size);  
        for (int i = 0; i < size; ++ i)  
            printf("%c ",ans[i]+'A');  
        printf("-> %d\n",maxbandwidths);  
    }  
    return 0;  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章