贪心代码:
#include
#include #include #include #include #include 并查集代码:
#include
#include #include #include #include #include using namespace std; typedef long long ll; #define mem(a,b) memset(a,b,sizeof(a)) #define N 10010 int F[N],n; struct node { int p,d; } q[N]; bool cmp(node a,node b)//按p从大到小排序。d没有关系 { return a.p>b.p; } int getf(int x) { if(F[x]==-1) return x; return F[x]=getf(F[x]); } int main() { while(~scanf("%d",&n)) { mem(F,-1); for(int i=0; i 0) { ans+=q[i].p; F[t]=t-1; } } printf("%d\n",ans); } }
AC代码:
#include
#include #include using namespace std; int f[1200000],a[1200000],b[1100000],book[1200000],ww; int getf(int v) { if(f[v]==v) return v; else return f[v]=getf(f[v]); } void merge(int x,int y) { int t1,t2; t1=getf(x); t2=getf(y); if(t1!=t2) f[t2]=t1; else ww++; } int main() { int kk=1,aaa,bbb; while(~scanf("%d%d",&aaa,&bbb)&&(aaa!=-1||bbb!=-1)) { if(aaa==0&&bbb==0)///进行数据处理 { printf("Case %d ",kk++); printf("is a tree.\n"); continue; } int maxx=-1,ans=0; memset(f,0x3f3f3f3f,sizeof(f)); memset(book,0,sizeof(book)); if(book[aaa]==0) { book[aaa]=1; ans++; } if(book[bbb]==0) { book[bbb]=1; ans++; } maxx=max(maxx,max(aaa,bbb)); f[aaa]=aaa; f[bbb]=bbb; a[0]=aaa; b[0]=bbb; int t=1,aa,bb; while(scanf("%d%d",&aa,&bb)&&(aa||bb)) { maxx=max(maxx,max(aa,bb)); if(book[aa]==0) { book[aa]=1; ans++; } if(book[bb]==0) { book[bb]=1; ans++; } f[aa]=aa; f[bb]=bb; a[t]=aa; b[t]=bb; t=t+1; } ww=0; int sum=0; for(int i=0; i
AC代码:
#include
#include #include #include
AC代码:
#include
#include #include #include #include #include #include #include
AC代码:
#include
#include #include #include using namespace std; int first[1100000],next[1100000],u[1100000],v[1010000],w[1100000]; int book[1100000],dis1[1100000],dis2[1100000]; int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); int tt=0; memset(first,-1,sizeof(first)); for(int i=1; i<=m; i++) { scanf("%d%d%d",&u[i],&v[i],&w[i]); next[i]=first[u[i]];///正向建边 first[u[i]]=i; } memset(book,0,sizeof(book)); memset(dis1,0x3f3f3f3f,sizeof(dis1)); memset(dis2,0x3f3f3f3f,sizeof(dis2)); queue q; q.push(1); dis1[1]=0; while(!q.empty())///spfa算法 { int x=q.front(); q.pop(); book[x]=0; for(int j=first[x]; j!=-1; j=next[j]) { if(dis1[v[j]]>dis1[x]+w[j]) { dis1[v[j]]=dis1[x]+w[j]; if(book[v[j]]==0) { book[v[j]]=1; q.push(v[j]); } } } } memset(book,0,sizeof(book)); memset(first,-1,sizeof(first)); for(int i=1; i<=m; i++)///反向建边 { next[i]=first[v[i]]; first[v[i]]=i; } queue Q; Q.push(1); dis2[1]=0; while(!Q.empty())///spfa算法 { int x=Q.front(); Q.pop(); book[x]=0; for(int j=first[x]; j!=-1; j=next[j]) { if(dis2[u[j]]>dis2[x]+w[j]) { dis2[u[j]]=dis2[x]+w[j]; if(book[u[j]]==0) { book[u[j]]=1; Q.push(u[j]); } } } } long long sum=0; for(int i=1; i<=n; i++)///对应相加求和 sum=sum+dis1[i]+dis2[i]; printf("%lld\n",sum); } return 0; }
AC代码:
#include
#include #include #include #define N 70005 #include using namespace std; int book[3005];//标记这个城市是否遍历过 int root[3005];//例root[i]表示起点到i城市的最远距离,i是被保护的城市。 int num[3005];//记录城市i被多少个城市保护 int e[3005][3005];//两城市之间的最短距离 int dis[3005];//起点到i之间的最短距离 vector v[3005];//例如v[u][i],表示u城市保护i城市 int main() { int t; scanf("%d",&t); while(t--) { int n,m,a,b,c,h; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)//容器清空 v[i].clear(); memset(root,0,sizeof(root)); memset(book,0,sizeof(book)); memset(e,0x3f3f3f3f,sizeof(e)); memset(dis,0x3f3f3f3f,sizeof(dis)); memset(num,0,sizeof(num)); for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); e[a][b]=min(e[a][b],c); } for(int i=1; i<=n; i++) { scanf("%d",&num[i]); for(int j=1; j<=num[i]; j++) { scanf("%d",&h); v[h].push_back(i); } } dis[1]=0; for(int i=1; i<=n; i++) { int minn=0x3f3f3f3f,u;//u是保护的城市 for(int j=1; j<=n; j++) { dis[j]=max(dis[j],root[j]);//每遍历一个点都要更新一下 if(dis[j] dis[u]+e[u][j]) dis[j]=dis[u]+e[u][j]; } printf("%d\n",dis[n]); } return 0; }