摘要:这题就是一最短路,不过,在这里是找"最长路",所以在初始化时不能赋值为0x7fffffff,而赋为0,还有存贮是记得用double型#include<stdio.h>int n,q,des[1005],s,e;double map[1005][1005],dis[1005];double Dij( ){ for( int i = 0; i <= n; ++i ) des[i] = 0,dis[i] = 0; dis[s] = 1; for( int i = 1; i <= n; ++i ) { int pos = -1; double max = -
阅读全文
摘要:这题是一个最小生成树,用kustra做,在给结构体排序时要用快排,不能冒泡,否则超时,这里有我冒泡的代码,你可以提交试试#include<stdio.h>#include<stdlib.h>int set[105],n,m,sum;struct e{ int x,y,v;}val[10000];int cmp( const void *a,const void *b ){ return ( ( e * )a )-> v - ( ( e * )b ) ->v;}int find( int x ){ return x == set[x] ? x : set[x]
阅读全文
摘要:跟畅通工程差不多,我的代码就在那上面改的#include<stdio.h>#include<stdlib.h>struct e{ int x,y,v;}val[10500];int n,m,set[105],sum;int cmp( const void *a,const void *b ){ return ( ( e * )a ) -> v - ( ( e * )b ) -> v;}int find( int i ){ return i == set[i] ? i :set[i] = find( set[i] );}void Kustra( ){ for(
阅读全文
摘要:这题数据真是恶心,开始敲出来了,一直WA,后来重敲一遍还是WA,最后看小白的代码才知道,还有( 0 0 ) 这种恶心的数据#include<stdio.h>#include<string.h>int set[100005],des[100005],f;int find( int x ){ return set[x] == x ? x : set[x] = find( set[x] );}void merge( int x,int y ){ int a = find( x ),b = find( y ); if( a != b ) set[a] = b; else if(
阅读全文
摘要:这题好悲剧啊,我用floyd做一直不能过,迷惑了我一晚上,改了N个地方还是wa,最后看着大牛代码改终于发现,floyd关系弄错了#include<stdio.h>int map[26][26];void floyd( ){ for( int i = 0; i < 26; ++i ) for( int j = 0 ; j < 26; ++j ) for( int k = 0; k < 26; ++k ) if( map[j][i] && map[i][k] ) map[j][k] = map[j][i] + map[i][k];//wa所在地 }vo
阅读全文
摘要:今天的这题有点悲剧,错就错在一个地方,在输入距离的时候,我把花费也考虑进去了,结果一只wa,没办法,看了大牛的代码才知道只要考虑距离;#include<stdio.h>int n,m,s,t;int inf = 0x7fffffff,des[1024],dis[1024],map[1024][1024];int co[1024],cost[1024][1024];void Dijkstra( ){ for( int i = 1; i <= n; ++i ) { dis[i] = co[i] = inf; des[i] = 0; } dis[s] = co[s] = 0; f
阅读全文
摘要:#include<stdio.h>int map[1024][1024],des[1024],dis[1024],s,w;int m,n,inf = 0x7fffffff,q;int Dijkstra( ){ dis[0] = 0; for( int i = 0; i <= n; ++i ) { int min = inf,t = 0,pos = -1; for( int j = 0; j <= n; ++j ) { if( !des[j] ) if( dis[j] < min ) { min = dis[j]; pos = j; } } des[pos] = 1
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>int m,n,map[1024][1024],des[1024],dis[1024],dep[1024];int inf = 0x7fffffff;int Dijkstra( int p ){ dis[p] = 0; for( int i = 1; i <= n; ++i ) { int min = inf, pos = 0,t; for( int j = 1; j <= n; ++j ) { if( !des[j] ) if( dis[j] < min ) { min = dis
阅读全文
摘要:#include<stdio.h>#include<math.h>#include<stdlib.h>struct E{ int x,y,set;}e[124];struct val{ int a,b; double dis;}va[10000];int t,c,count;int cmp( const void *a,const void *b ){ return ((val *)a)->dis > ((val *)b)->dis ? 1 : -1;}int find( int i ){ return e[i].set == i ? i
阅读全文
摘要:这题真恼火,写完代码后自己测试都能过,就是wa,于是我把代码重新敲了一遍,没想到还是wa,最后只能去找大牛的代码,大牛都是用字典树做的,显然与我的不符,最后在自己的代码上改,终于改到一个地方,在初始化的时候全部从0开始初始化,果断水过#include<stdio.h>#include<string.h>char word[160][300] = {0},a[300],b[300],start[300],end[300],p,q;int map[160][160],c,des[160],dis[160],n;int inf = 0x7fffffff;int obtain(
阅读全文
摘要:#include<stdio.h>int inf = 0x7fffffff;int map[1024][1024],des[1024],dis[1024],s,max,t,d,a[1024],b[1024];int Dijkstra( ){ ++max; for( int i = 1; i <= d; ++i ) map[b[i]][max] = map[max][b[i]] = 0; dis[0] = 0; for( int i = 0; i <= max; ++i ) { int min = inf,pos = -1,t; for( int j = 0; j <
阅读全文
摘要:#include<stdio.h>int inf = 0x7fffffff;int map[110][110],des[110],dis[110],n,m;//dis[i]表示i点到原点的距离void dij( )//des作为标记符{ dis[1] = 0; for( int i = 1; i <= n; ++i ) { int min = inf,pos = 0; for( int j = 1; j <= n; ++j )//找到当前未标记的权值最小的点 if( !des[j] && dis[j] < min ) { min = dis[ j
阅读全文
摘要:此题是最小生成树的基础题#include<stdio.h>#include<string.h>#include<stdlib.h>int set[124],n,t,a,b,c;long long min;struct map{ int x,y,val;}m[ 100000 ];int cmp( const void *a,const void *b ){ return ( ( map * ) a ) -> val - ( ( map * ) b ) -> val;}int find( int i ){ return set[ i ] == i ?
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>#include<string.h>int len,map[26][ 26 ],des[26],a,b,f = 0,m;char ch[1000];void DFS( int n ){ if( f ) return ; if( n == 'm' - 'a' ) { f = 1; return; } for( int i = 0; i < 26 ; ++i ) { if( n != i && map[n][i] == 1 ) { if(
阅读全文
摘要:这是我第二次敲这个题,没想到果断悲剧了,最后只能翻出以前的代码,没想到是qsort出问题了,以后qsort全部用问号表达式,不再用a-b了.#include<stdio.h>#include<math.h>#include<stdlib.h>int set[105],t,c,m;double sum = 0;struct e{ int x,y; double v;}val[10000];struct coor{ int x,y;}co[105];int cmp( const void *a,const void *b ){ return ((e *)a) -
阅读全文
摘要:这题分为四个步骤 压缩,合并完全,压缩查找最大集合include<stdio.h>int set[10000000],count[10000000];int find( int x ){ return set[ x ] == x ? x : set[ x ] = find( set[ x ] );} void merge( int x,int y ){ int a = find( x ),b = find( y ); set[ a ] = b; }int main( ){ int n,i,a,b; while( scanf( "%d",&n ) !=EO
阅读全文
摘要:并查集基础#include<stdio.h>int set[100000];int find( int i ){ return set[ i ] == i ? i : set[ i ] = find( set[ i ] );//路径压缩}//查找跟结点void merge( int x,int y ){ int a = find( x ), b = find( y ); if( a != b ) set[ a ] = b;//合并 }int main( ){ int T,n,m,a,b; scanf( "%d",&T ); while( T-- ) {
阅读全文
摘要:这题就是把所有的村庄看它们是否畅通来分成n个集合,然后只要修建 n - 1 条道路就可以把他们连起来了#include<stdio.h>int set[ 1024 ];int find( int i ){ return set[ i ] == i ? i : set[ i ] = find( set[ i ] );}void merge( int x, int y ){ int a = find( x ),b = find( y ); set[ a ] = b; }int main( ){ int n,m,a,b; while( scanf( "%d",&
阅读全文
摘要:这题是刚学最小生成树的一入门题,其实就是求最小生成树,用结构体定义这棵树,到时候便于权值排序,输入后进行排序,让后再讲这些顶点连成一个集合,并在这过程中把各权值相加(因为这些权值已按递增排列,所以得出的集合时权值最小的),至于是否能保证畅通则只要看有几个根结点就可以了#include<stdio.h>#include<stdlib.h>#include<string.h>int set[1000],n,m,x,y,val;struct Ed{ int x,y,val; }e[10000];int cmp( const void *a,const void *
阅读全文