生活随笔
收集整理的這篇文章主要介紹了
【五校联考7day2】QYQ的图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
給你一個n個點,m條邊的無向圖,每個點有一個非負的權值ci,現在你需要選擇一些點,使得每一個點都滿足:
如果這個點沒有被選擇,則與它有邊相連的所有點都必須被選擇。
問:滿足上述條件的點集中,所有選擇的點的權值和最小是多少?
QYQ很快就解決了這個問題,但是他已經回到了左下角……沒有留下答案,現在只好請你來解決這個問題啦!
Input
從文件graph.in中輸入數據。
輸入的第一行包含兩個整數n,m
輸入的第二行包含n個整數,其中第i個整數代表ci
輸入的第三行到第m+2行,每行包含兩個整數u,v,代表點u和點v之間有一條邊
Output
輸出到文件graph.out中。
輸出的第一行包含一個整數,代表最小的權值和
Sample Input
3 1
1 2 3
3 1
Sample Output
1
樣例說明:
只選擇1號點,滿足題意
Data Constraint
對于20% 的數據:n<=10
對于40%的數據:n<=20
對于100%的數據:1<=n<=50, 1<=m<=500, 0<=c<=1000
圖中可能會有重邊,自環。
點的編號為1—n。
.
.
.
.
.
分許
直接搜索就好了,當然不要 O(2^n)那種,每次搜索的時候如果這
個點不選,就直接把與它相連的所有點選上,搜索的時候加入一些剪
枝,比如如果現在的結果已經比現在的最佳答案大了就直接不搜了。
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;int n,m,c[51],cnt=1,head[51],ans=2147483647,f[51];struct edge
{int next,to;
} a[1010];inline int read()
{int d=0;char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9')d=(d<<3)+(d<<1)+ch-48,ch=getchar();return d;
}void add(int x,int y)
{a[cnt].next=head[x];a[cnt].to=y;head[x]=cnt++;
}void dfs(int x,int sum)
{if (sum>=ans) return;if (x>n){ans=min(ans,sum);return;}f[x]++;dfs(x+1,sum+c[x]);f[x]--;if (!f[x]){for (register int i=head[x];i;i=a[i].next)f[a[i].to]++;dfs(x+1,sum);for (register int i=head[x];i;i=a[i].next)f[a[i].to]--;}
}int main()
{freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);n=read();m=read();for (register int i=1;i<=n;i++)c[i]=read();for (register int i=1;i<=m;i++){int x,y;x=read();y=read();if (x==y) f[x]++; else{add(x,y);add(y,x);}}dfs(1,0);printf("%d",ans);fclose(stdin);fclose(stdout);return 0;
}
轉載于:https://www.cnblogs.com/YYC-0304/p/10458929.html
總結
以上是生活随笔為你收集整理的【五校联考7day2】QYQ的图的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。