ACM 2009. 6. 2. 21:02
반응형

This code is also another co-worker's source.
He makes it even if he didn't use any algorithm.
He made his own way that he delete the edge which is not the answer

----------------------------------------------------------------------------------------------

#include

#define MAXV            100
#define MAXDEGREE       100

typedef struct {
        unsigned int edges[MAXV+1][MAXV+1];
        unsigned int nverticies;
        unsigned int nedges;
} graph;

graph g;

typedef struct {
        unsigned int x;
        unsigned int y;
        unsigned int value;
} minSt;

minSt minList[10000];
unsigned int minCnt;

int map[100];
int cnt;

void init_graph()
{
        memset(&g, 0, sizeof(graph));
}

void set_edges(int i)
{
        g.nedges = i;
}

void set_verticies(int i)
{
        g.nverticies = i;
}

void set_edge(int x, int y,int weight)
{
        g.edges[x][y] = weight;
        g.edges[y][x] = weight;

        minList[minCnt].x = x;
        minList[minCnt].y = y;
        minList[minCnt++].value = weight;
}

void sort_min()
{
        minSt tmp;
        int i,j;

        for ( i = 0 ; i < minCnt ; i++ ) {
                for ( j = i ; j < minCnt ; j++ ) {
                        if ( minList[i].value > minList[j].value ) {
                                tmp = minList[i];
                                minList[i] = minList[j];
                                minList[j] = tmp;
                        }
                }
        }
#if 0
        for ( i = 0 ; i < minCnt ; i++ ) {
                printf("x(%d) y(%d) weight(%d)\n",minList[i].x, minList[i].y, minList[i].value);
        }
#endif
}

void print_graph()
{
        int i,j;
        printf("==========================\n");
        for ( i = 1 ; i <= g.nverticies ; i++ ) {
                for ( j = 1 ; j <= g.nverticies ; j++ ) {
                        printf("%3d ",g.edges[i][j]);
                }
                printf("\n");
        }
}

unsigned int ConnMap[101][101];

int isConnected2()
{
        int i,j,k;

        memcpy(ConnMap, g.edges, sizeof(ConnMap));

        for ( i = 1 ; i <= g.nverticies ; i++ ) {
                for ( j = 1 ; j <= g.nverticies ; j++ ) {
                        if ( i == j )
                                continue;
                        for ( k = 1 ; k <= g.nverticies ; k++ ) {
                                if ( j == k )
                                        continue;
                                if ( i == k )
                                        continue;
                                if ( ConnMap[i][j] > 0 && ConnMap[j][k] > 0 ) {
                                        ConnMap[i][j] = 1;
                                        ConnMap[j][i] = 1;

                                        ConnMap[j][k] = 1;
                                        ConnMap[k][j] = 1;

                                        ConnMap[i][k] = 1;
                                        ConnMap[k][i] = 1;
                                }
                        }
                }
        }

#if 0
        printf("==========================\n");
        for ( i = 1 ; i <= g.nverticies ; i++ ) {
                for ( j = 1 ; j <= g.nverticies ; j++ ) {
                        printf("%3d ",ConnMap[i][j]);
                }
                printf("\n");
        }
        exit(0);
#endif

}

int isConnected(int start,int end)
{
        register unsigned int i,j;
        register unsigned int check=0;

        if ( start == end )
                return 1;

#if 1
        if ( g.edges[start][end] > 0 ) {
                return 1;
        }
#endif

        for ( i = 1 ; i <= g.nverticies ; i++ ) {
                if ( i == start )
                        continue;

                check = 0;
                for ( j = 0 ; j < cnt ; j++ ) {
                        if ( map[j] == i ) {
                                check=1;
                                break;
                        }
                }
                if ( check == 1 )
                        continue;

                if ( g.edges[start][i] > 0) {
                        map[cnt]=start;
                        cnt++;
                        if (isConnected(i,end) == 1 ) {
                                return 1;
                        }
                }
        }
        return 0;
}


void del_edge(int x,int y)
{
        g.edges[x][y] = 0;
        g.edges[y][x] = 0;
}

int main()
{
        int edge;
        int vert;
        int x,y;
        int i,weight;
        int start, end, people;
        int min;
        int scenario=1;

        while(1) {
                init_graph();
                scanf("%d %d",&vert,&edge);
                if ( vert == 0 )
                        break;
                if ( vert < 1 || vert > 100 )
                        continue;

                set_verticies(vert);
                set_edges(edge);

                for ( i = 0 ; i < edge ; i++ ) {
                        scanf("%d %d %d",&x,&y,&weight);
                        set_edge(x,y,weight);
                }
                scanf("%d %d %d",&start,&end,&people);

                sort_min();

                cnt = 0;
                i = 0;

                while ( isConnected(start,end)) {
#if 0
                while ( 1 ) {
                        isConnected2();
                        if ( ConnMap[start][end] == 0 )
                                break;
#endif

                        cnt = 0;
                        min = minList[i].value;
                        del_edge(minList[i].x,minList[i].y);
                        i++;
                }

                if ( people % (min-1 ) == 0 )
                        min = people/(min-1);
                else
                        min = people/(min-1) + 1;

                printf("Scenario #%d\n",scenario++);
                printf("Minimum Number of Trips = %d\n\n",min);

                minCnt = 0;

                fflush(stdin);
        }

        return 0;
}


#if 0
int find_min(int *x, int *y)
{
        int i,j;
        int min=99999;
        int a;

        for ( i = 1 ; i <= g.nverticies ; i++ ) {
                for ( j = 1 ; j <= g.nverticies ; j++ ) {
                        if ( g.edges[i][j] > 0 && g.edges[i][j] < min ){
                                min = g.edges[i][j];
                                *x = i;
                                *y = j;
                        }
                }
        }
        return min;
}
#endif

반응형

'ACM' 카테고리의 다른 글

[Accept] 850 Crypt Kicker II  (0) 2009.06.02
[Accept] 10132 File Fragmentation  (0) 2009.06.02
[Accept] 10099 - The Tourist Guide  (0) 2009.06.02
[Time Limit] 10099 - The Tourist Guide  (0) 2009.06.02
[Accept] 10004 - Bicoloring problem  (0) 2009.06.02
posted by ssuk1010
:
ACM 2009. 6. 2. 20:56
반응형

Unfortunately, I didn't get accept from Judge Server.
This code is one of my co-worker's source.
He used Dynamic Programming.
I should study that algorithm.

----------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
int g_cities[101][101];
 
#define MIN(a,b) (a>b?b:a)
 
int search_min_trips(int start, int end, int num_cities)
{
    int i, j, k;
    int max = 0, min;
    for (i = 1; i <= num_cities; i++) {
    for (j = 1; j <= num_cities; j++) {
    for (k = 1; k <= num_cities; k++) {
        min = MIN(g_cities[i][k], g_cities[k][j]);
        if (g_cities[i][j] < min)
            g_cities[i][j] = g_cities[j][i] = min;
    }}} 
    return g_cities[start][end];
}   
 
int main()
{
    int i, cnt = 0;
    int num_cities;
    int num_roads;
    int num_passengers;
    int start, end;
    int city1, city2, cap;
    int max_cap;
    
    while (scanf("%d %d", &num_cities, &num_roads) != 1 && num_cities != 0 && num_roads != 0) {
        memset(g_cities, 0x00, sizeof(g_cities));
        for (i = 0; i < num_roads; i++) {
            scanf("%d %d %d", &city1, &city2, &cap);
            g_cities[city1][city2] =  
            g_cities[city2][city1] = cap;
        }   
        scanf("%d %d %d", &start, &end, &num_passengers);
        max_cap = search_min_trips(start, end, num_cities) - 1;
        printf("Scenario #%d\n", ++cnt);
        printf("Minimum Number of Trips = %d\n\n", num_passengers / max_cap + (num_passengers % max_cap == 0 ? 0 : 1));
    }   
    return 0;
}
반응형

'ACM' 카테고리의 다른 글

[Accept] 10132 File Fragmentation  (0) 2009.06.02
[Accept] 10099 - The Tourist Guide  (0) 2009.06.02
[Time Limit] 10099 - The Tourist Guide  (0) 2009.06.02
[Accept] 10004 - Bicoloring problem  (0) 2009.06.02
[Accept] 100 - The 3n+1 problem  (0) 2009.06.02
posted by ssuk1010
:
ACM 2009. 6. 2. 20:51
반응형
I got time limite from Judge Server. T.T

#include <stdio.h>
 
#define MAX_CITY                101
#define DISCONNECTED        0
#define PASSED                        1
#define NOTPASSED                0
 
typedef struct TourInfo{
        int roadNum;                                                // road Number (input)
        int cityNum;                                                // city Number (input)
        int roadInfo[MAX_CITY][MAX_CITY];        // road info (max passenger info)
        int cityIsPassed[MAX_CITY];                 // passed or not passed
        int cityMinNum[MAX_CITY];                         // min Passenger Number 
        int startCity;                                                // start (input)
        int destCity;                                                // destination (input)
        int totalPassengerNum;                                // total passenger Number (input)
        int minPassengerNum;                                // result
}TourInfo;
 
void initTourInfo();
int findMinNumberOfTrips(int left);
 
TourInfo tour;
 
int main(void)
{
        int firstCity, secondCity, maxPassengerNum;
        int scenarioCount=0, result, i;
        while(1){
                
                scanf("%d %d", &tour.cityNum, &tour.roadNum);
                if(tour.cityNum==0  && tour.roadNum==0) break;
 
                result = 0;
                initTourInfo();
 
                for(i=0; i<tour.roadNum; i++){
                        scanf("%d %d %d", &firstCity, &secondCity, &maxPassengerNum);
                        tour.roadInfo[firstCity][secondCity] = maxPassengerNum;
                        tour.roadInfo[secondCity][firstCity] = maxPassengerNum;
                }
                scanf("%d %d %d", &tour.startCity, &tour.destCity, &tour.totalPassengerNum);
                if(tour.totalPassengerNum < 1) break;
 
                findMinNumberOfTrips(tour.startCity);
 
                scenarioCount++;
                result = tour.totalPassengerNum / (tour.minPassengerNum-1);   
                if(tour.totalPassengerNum % (tour.minPassengerNum-1))
                        result++;
 
                printf("Scenario #%d\n", scenarioCount);
                printf("Minimum Number of Trips = %d\n\n", result);
        } 
        return 0;
}
 
int findMinNumberOfTrips(int left)
{
        int i, right, minPass;
 
        tour.cityIsPassed[left]=PASSED; 
 
        // Last City
        if(left==tour.destCity){
                                
                if(!tour.minPassengerNum) {
                        tour.minPassengerNum = tour.cityMinNum[left];
                }
                else {
                        if(tour.minPassengerNum < tour.cityMinNum[left]) {
                                tour.minPassengerNum = tour.cityMinNum[left];
                        }
                }
                tour.cityMinNum[left]=NOTPASSED;
                tour.cityIsPassed[left]=NOTPASSED;
                return 1;
        }
 
        for(right=1; right<=tour.cityNum; right++)
        {
                if(tour.cityIsPassed[right]==PASSED) continue; // already passed city
 
                if(tour.roadInfo[left][right]!=0) // CONNECTED
                {
                        if(!tour.cityMinNum[left]){ // first path
                                tour.cityMinNum[right] = tour.roadInfo[left][right];
                        }
                        else{
                                if(tour.cityMinNum[left] > tour.roadInfo[left][right]){
                                        tour.cityMinNum[right] = tour.roadInfo[left][right];
                                }
                                else{
                                        tour.cityMinNum[right] = tour.cityMinNum[left];
                                }
                        }
 
                        if(tour.minPassengerNum >= tour.cityMinNum[right])
                                continue;
 
                        findMinNumberOfTrips(right);
                }
        }
        // init and return
        tour.cityMinNum[left]=NOTPASSED;
        tour.cityIsPassed[left]=NOTPASSED;
        return 1;
}
 
 
void initTourInfo()
{
        int i,j;
        for(i=0; i<MAX_CITY; i++) {
                for(j=0; j<MAX_CITY; j++) {
                        tour.roadInfo[i][j] = DISCONNECTED;
                }
                tour.cityIsPassed[i] = NOTPASSED;
                tour.cityMinNum[i] = NOTPASSED;
        }
        tour.minPassengerNum = 0;
}
반응형

'ACM' 카테고리의 다른 글

[Accept] 10099 - The Tourist Guide  (0) 2009.06.02
[Accept] 10099 - The Tourist Guide  (0) 2009.06.02
[Accept] 10004 - Bicoloring problem  (0) 2009.06.02
[Accept] 100 - The 3n+1 problem  (0) 2009.06.02
10006 - Carmichael Numbers  (0) 2009.06.02
posted by ssuk1010
: