马蹄集第32周

1、匹配图

知识点:图论但是感觉也没有用到图论的东西

马蹄集第32周_第1张图片

解题代码:

n,m = map(int,input().split())
a = [int(i) for i in input().split()]
b = []
map = [[0 for i in range(n)] for j in range(n)]
for i in range(m):
    temp =[]
    temp = [int(i) for i in input().split()]
    map[temp[0] - 1][temp[1] - 1] = 1
    map[temp[1] - 1][ temp[0] - 1] = 1
    b.append(temp)
result =[]
for x in range(n):
    for y in range(x+1,n):
        for z in range(y+1,n):
            if map[x][y] == map[y][z] ==map[z][x] ==1:
                result.append(a[x] + a[y] + a[z])
if result == None:
    print(-1)
else:
    print(min(result))

2、过年访亲

马蹄集第32周_第2张图片

解题思路:dfs

解题反思:自己做的时候,首先没有审题还写了一个在任意位置开始的情况,其次dfs的参数没有想好,写的太麻烦了,最后即便写了dfs但是后面的回溯之后也没写好。

n = int(input())
dis = []
for i in range(n):
    temp = []
    temp = [int(i) for i in input().split()]
    dis.append(temp)
ans = 10000
tmp = 0
vis = [0 for i in range(n)]
#u表示当前搜到那个编号的家庭,s表示已经走过了的家庭的个数
def dfs(u,s):
    global tmp,ans,n
    if s==n:
        #表示已经走过了n个家庭了
        ans = min(ans,tmp+dis[u][0])
        # print(ans)
        #走到最后一个家庭还要走回自己家
        return
    for i in range(1,n):
        if vis[i]==0 and u!=i:
            vis[i] =1
            tmp += dis[u][i]
            dfs(i,s+1)
            #回溯退回上一个节点
            vis[i]=0
            tmp -= dis[u][i]
dfs(0,1)
print(ans)

3、文件管理

马蹄集第32周_第3张图片

解题思路:DFS但是看着就很复杂......

确实有点看不懂,不管了,先抄上去

#include 
using namespace std;
const int N =1e3 + 7;
struct NODE{
    int level;
    string str;
    int ID;
    int father;
    vector son;
}graph[N];
string str2;
vector ans;
stack st;
int cnt;
bool flag;

void dfs(int num){
    //字符串变量等于我们需要的字符串
    if(graph[num].str == str2){
        for(string tmp : ans)
            cout << tmp;
        cout << endl;
        flag = true;
    }
    for(int id : graph[num].son){
        ans.push_back("/");
        ans.push_back(graph[id].str);
        dfs(id);
        ans.pop_back();
        ans.pop_back();
    }
}
int main(){
    graph[0].level = 0;
    st.push(graph[0]);
    //这个栈的意义是找到父节点
    while(true){//这个循环时不断输入的过程,求出来每个节点的父节点是谁,是第几层的目录
        getline(cin,str2);
        if(str2 == "#")//如果是#就退出这个循环
            break;
        for (int i =0;;i++)
            if(str2[i] != ' '){
                graph[++cnt].str = str2.substr(i);
                graph[cnt].level = i + 1;
                graph[cnt].ID = cnt;
                while(st.top().level >= graph[cnt].level)
                    st.pop();
                    //找到父节点是谁
                graph[cnt].father = st.top().ID;
                graph[st.top().ID].son.push_back(cnt);
                st.push(graph[cnt]);
                break;
            }
    }
    cin >> str2;
    dfs(0);
    if(!flag)
        cout<<"NULL";
}

你可能感兴趣的:(算法,数据结构)