2015 长春网赛 图论
2015-09-19 17:41
183 查看
//hdu 5438 /*题意:就是给你一个图 每个节点都有一个价值 问去掉那些度数小于2的点后 构成的奇数环的所有点的值之和*/ /*bfs dfs 对于图来说都是O(n)的算法,对于数据特别大的来说应该好好去想想这个方面的算法 乱搞只会超时*/ /* #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<vector> using namespace std; typedef long long ll; typedef pair<int,int> pp; #define inf 0x3f3f3f3f #define eps 1e-10 #define maxl 10010 #define mem(i,j) memset(i,j,sizeof(i)) const int mod=1e9+7; int in[maxl],v[maxl]; bool vis[maxl]; vector<int> g[maxl]; int n,m; void dfs(int p,ll &sum,int &cnt){ sum+=v[p]; cnt++; vis[p]=1; for(int i=0;i<g[p].size();i++){ int q=g[p][i]; if(!vis[q]) dfs(q,sum,cnt); } return ; } int main() { freopen("in.txt", "r", stdin); int t; cin>>t; while(t--){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>v[i]; g[i].clear(); vis[i]=false; in[i]=0; } int x,y; for(int i=0;i<m;i++){ cin>>x>>y; g[x].push_back(y); g[y].push_back(x); in[x]++;in[y]++; } queue<int> que; for(int i=1;i<=n;i++){ if(in[i]<2) que.push(i); } while(que.size()){ int p=que.front();que.pop(); vis[p]=1; for(int i=0;i<g[p].size();i++){ int q=g[p][i]; in[q]--; if(in[q]<2&&!vis[q]) que.push(q); } } ll ans=0; for(int i=1;i<=n;i++){ ll sum=0;int cnt=0; if(!vis[i]) dfs(i,sum,cnt); if(cnt&1) ans+=sum; } cout<<ans<<endl; } } */
//B hdu 5441题目就是说 给你一个数值 问小于这个数值的边所构成的路径数目 尼玛 如果是cin和scanf的区别 /* #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<vector> using namespace std; typedef long long ll; typedef pair<int,int> pp; #define inf 0x3f3f3f3f #define eps 1e-10 #define maxl 100010 #define mem(i,j) memset(i,j,sizeof(i)) const int mod=1e9+7; int n,m,q; ll res; int fa[20020],h[20020],num[20020]; ll ans[5005]; struct edge{ int from,to,cost; edge(){} edge(int from,int to,int cost):from(from),to(to),cost(cost){} bool operator< (const edge& rhs) const { return cost < rhs.cost; } }p[maxl]; struct Q{ int id,num; bool operator< (const Q& rhs) const { return num < rhs.num; } }v[5005]; void init(int n){ for(int i=1;i<=n;i++) fa[i]=i,h[i]=0,num[i]=1; } int find(int x){ return fa[x]==x ? x:find(fa[x]); } void unite(int x,int y){ x=find(x);y=find(y); if(x==y) return ; res+=num[x]*num[y]; if(h[x]<h[y]) { fa[x]=y;//这里分情况和引入了h这个数组是防止树的退化 平均了树 num[y]+=num[x];num[x]=0; } else { fa[y]=x; if(h[x]==h[y]) h[x]++; num[x]+=num[y];num[y]=0; } } int main() { freopen("in.txt", "r", stdin); int t; cin>>t; while(t--){ scanf("%d%d%d",&n,&m,&q); for(int i=0;i<m;i++){ int u,v,c;scanf("%d%d%d",&u,&v,&c); p[i]=edge(u,v,c); } sort(p,p+m); for(int i=0;i<q;i++){scanf("%d",&v[i].num);v[i].id=i;} sort(v,v+q); int len=0,cnt=0; init(n); res=0; for(int i=0,j=0;i<q;i++){ int dist=v[i].num; while(j<m){ edge e1=p[j]; if(e1.cost<=dist) unite(e1.from,e1.to); else break; j++; } ans[v[i].id]=res; } for(int i=0;i<q;i++) cout<<ans[i]*2<<endl; } }
相关文章推荐
- mybatis generator使用
- 黑发不知勤学早,白首方悔读书迟。
- Java基础知识强化35:String类之String的其他功能
- 类似搜狐视频app视频列表播放
- android AsyncTask介绍
- IAR中C内嵌汇编格式
- 你的程序会崩溃吗?
- YII框架的类自动加载机制
- 《语音信号处理》学习笔记
- CentOS 7 Tomcat路径
- JUnit使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
- NYOJ 949 哈利波特
- PHP防止SQL注入的方法(2)
- STM32外设使用要点
- HTML绝对路径和相对路径
- 重造轮子-最小栈
- Cocos2d-x 3.0 lua规划 真正的现在Android在响应Home密钥和Back纽带
- swift 接口类与实现类
- Ember.js 入门指南——{{link-to}} 助手
- sql语句分析