1034. Head of a Gang (30)
2015-01-26 11:02
190 查看
http://www.patest.cn/contests/pat-a-practise/1034
好吧,这个题目还有好几个没过,要好好研究
主要用map,这是个神器啊!!!
貌似问题出现在回边访问,其实我没懂sad
好吧,这个题目还有好几个没过,要好好研究
主要用map,这是个神器啊!!!
貌似问题出现在回边访问,其实我没懂sad
#include <cstdio> #include <map> #include <vector> #include <string> #include <iostream> //体中给了说最多1000条边,因此最多有2000个点 #define MAX 2010 using namespace std; struct edge{ int next; int wei; }; vector <edge> adj[MAX]; int weigh[MAX]; map <string,int> mp; map <int,string> an; map <string,int> gang; bool vis[MAX]; void init(){ for(int i=0;i<MAX;i++){ adj[i].clear(); weigh[i]=0; } mp.clear(); an.clear(); } void dfs(int x,int &ans,int &max,int &maxi){ vis[x]=true; ans++; if(weigh[x]>max){ maxi=x; max=weigh[x]; } for(int i=0;i<adj[x].size();i++){ int j=adj[x][i].next; if(!vis[j]){ dfs(j,ans,max,maxi); } } } int main(){ freopen("in.txt","r",stdin); int n,k; while(scanf("%d %d",&n,&k)!=EOF){ init(); int cnt=0; for(int i=0;i<n;i++){ int a,b; string sa,sb; int cost; //scanf("%s%s%d",sa,sb,&cost); cin>>sa>>sb>>cost; map <string,int>::iterator it=mp.find(sa); if(it==mp.end()){ a=cnt; mp[sa]=cnt++; }else{ a=it->second; } it=mp.find(sb); if(it==mp.end()){ b=cnt; mp[sb]=cnt++; }else{ b=it->second; } for(it=mp.begin();it!=mp.end();it++){ an[it->second]=it->first; } weigh[a]+=cost; weigh[b]+=cost; edge tmp; tmp.next=a; tmp.wei=cost; bool flag=false; for(int i=0;i<adj[b].size();i++){ if(tmp.next==adj[b][i].next){ adj[b][i].wei+=tmp.wei; flag=true; break; } } if(!flag){ adj[b].push_back(tmp); } flag=false; tmp.next=b; for(int i=0;i<adj[a].size();i++){ if(tmp.next==adj[a][i].next){ adj[a][i].wei+=tmp.wei; flag=true; break; } } if(!flag){ adj[a].push_back(tmp); } } //当每个点权都小于k,不是gang int cnk=0; for(int i=0;i<cnt;i++){ if(weigh[i]<=k){ cnk++; } } if(cnk==cnt){ printf("0\n"); continue; } int res=0; int ff[MAX]; for(int i=0;i<cnt;i++){ int ans=0; int max=0; int maxi=0; if(!vis[i]){ dfs(i,ans,max,maxi); if(ans>2){ ff[res++]=maxi; for(int i=0;i<res;i++){ map <int,string>::iterator tt=an.find(ff[i]); gang[tt->second]=ans; } } } } printf("%d\n",res); if(res!=0){ map <string,int>::iterator a=gang.begin(); for(;a!=gang.end();a++){ //printf("%s %d\n",a->first,a->second); cout << a->first << ' '<< a->second <<endl; } } } return 0; }
相关文章推荐
- 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- PAT_A 1034. Head of a Gang (30)
- PAT (Advanced Level)1034. Head of a Gang (30) map的灵活运用
- 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)【离散化+并查集+搜索】——PAT (Advanced Level) Practise
- 1034. Head of a Gang (30)
- PTA 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- pat-a1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)(孤岛以及一个奇怪的cost的计算问题)
- 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30) DFS,删边
- 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)
- 1034. Head of a Gang (30)