水题MST吧。。对于这种模版题,我已经可以不用做了。。。。冲刺东北赛!!!!
Problem : 3371 ( Connect the Cities ) Judge Status : Accepted
RunId : 8394387 Language : C++ Author : CherryChou
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
RunId : 8394387 Language : C++ Author : CherryChou
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <cstdio> #include <cstring> #include <queue> #include <vector> #include <climits> using namespace std; const int maxn=2005 ; const int maxm=4000005; const int inf=INT_MAX; typedef pair<int,int>node; struct edge { int u,v,w,next; }e[maxm]; struct cmp { bool operator()(const node &a,const node &b)const { return a.second>b.second; } }; int num,head[maxn]; int dis[maxn],vis[maxn]; priority_queue<node,vector<node>,cmp>q; inline void add(int u,int v,int w) { e[num].u=u; e[num].v=v; e[num].w=w; e[num].next=head[u]; head[u]=num++; } void addedge(int u,int v,int w) { add(u,v,w); add(v,u,w); } int prime(int s) { int i,u,v,mincost=0; dis[s]=0; q.push(make_pair(s,0)); while(!q.empty()) { node a=q.top(); q.pop(); u=a.first; if(vis[u]) continue; vis[u]=1; mincost+=a.second; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(!vis[v]&&e[i].w<dis[v]) { dis[v]=e[i].w; q.push(make_pair(v,e[i].w)); } } } return mincost; } void init(int n) { num=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); for(int i=0;i<=n;i++) { dis[i]=inf; vis[i]=0; } } int main() { int T; scanf("%d",&T); while(T--) { int n,m,k,U,V,W,t,x,y; scanf("%d%d%d",&n,&m,&k); init(n); for(int i=1;i<=m;i++) { scanf("%d%d%d",&U,&V,&W); addedge(U,V,W); } while(k--) { scanf("%d",&t); scanf("%d",&x); for(int i=1;i<t;i++) { scanf("%d",&y); addedge(x,y,0); } } int ans=prime(1); int flag=1; for(int i=1;i<=n;i++) { if(vis[i]==0) { flag=0; break; } } if(flag) printf("%d\n",ans); else printf("-1\n"); } return 0; }