2014-2015 ACM-ICPC, Asia Tokyo Regional Contest F題:There is No Alternative [最小生成树]
2015-11-07 18:11
537 查看
题意:N个点,M条边,问最小生成树的必须边的条数和权值和,必须边是去掉后最小生成树会扩大的边。
范围:N至多500,M至多10000
解法:必须边必然在某个最小生成树中,一开始直接求一遍最小生成树,然后枚举树中每条边去掉后的MST是否会变大即可。
代码:
范围:N至多500,M至多10000
解法:必须边必然在某个最小生成树中,一开始直接求一遍最小生成树,然后枚举树中每条边去掉后的MST是否会变大即可。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=int(a);i<=int(b);i++) #define drep(i,a,b) for(int i=int(a);i>=int(b);i--) #define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next) #define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++) #define mem(x,val) memset(x,val,sizeof(x)) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; typedef pair<int,int> pii; int n,m; int eds1,eds2; int b[111],a[111]; int q[111111]; int head,tail; int dis[111111]; int t[111]; int swapx(int x,int y){ swap(t[x],t[y]); int ret=0; drep(i,n,1){ ret=ret<<1|t[i]; } swap(t[x],t[y]); return ret; } bool vis[111111]; void bfs(int root){ rep(i,1,33000)dis[i]=inf; head=tail=0; q[tail++]=root; dis[root]=0; while(head<tail){ int st=q[head++]; int x=st; vis[x]=1; rep(i,1,n){ t[i]=x&1; x>>=1; } rep(i,1,n-1){ int nst; nst=swapx(i,i+1); if(!vis[nst]){ vis[nst]=1; q[tail++]=nst; dis[nst]=min(dis[st]+1,dis[nst]); } } } } int c1[111],c2[111]; int main(){ scanff(n); scanff(m); rep(i,1,n)scanff(a[i]); int st=0; int x; eds1=eds2=0; int pd=0; int tot=0; rep(i,1,m){ pd^=1; scanff(x); rep(j,1,x){ tot++; c1[tot]=pd; c2[tot]=pd^1; } } drep(i,n,1){ eds1=eds1<<1|c1[i]; eds2=eds2<<1|c2[i]; } drep(i,n,1){ st=st<<1|a[i]; } bfs(st); printf("%d\n",min(dis[eds1],dis[eds2])); return 0; }
相关文章推荐
- ids for this class must be manually assigned before calling save():
- 一个java程序员自学IOS开发之路(六)
- Java NIO入门(二):缓冲区内部细节
- hadoop笔记
- Excel中根据XML映射导出XML数据
- 自定义广播、有序广播、无序广播、监听sd卡的状态
- 使用moment.js管理时间
- 简单了解ddos攻击
- 通过innobackupex实现对MySQL的单库备份
- 如何编写dao_servlet容器处理请求资源路径_路径匹配
- 套接字的(客户端与服务器端的连接)
- 选项卡操作
- AutoMapper(七)
- Webstorm10.0.3破解程序及汉化包下载、Webstorm配置入门指南
- 猴子吃桃问题
- linux 线程栈
- This data item is already used in a primary identifier.的处理
- eclipse开发Groovy代码,与java集成,maven打包编译
- 【iOS】文件下载小记
- hibernate使用list映射,查询出来的list集合包含多个null记录