您的位置:首页 > 其它

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: