kuangbin4(上)

kuangbin4(上)

熟悉鏈式前向星和鄰接矩陣;http://blog.csdn.net/chang_mu/article/details/38172311

[A - Til the Cows Come Home POJ - 2387 ]

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define CLR(a,v) memset(a,v, sizeof a)
#define maxnplus 9999999
int mp[2010][2010];
int dist[2010];
int vis[2010];

using namespace std;
int T,N;

int getNode(){
    int tempmin = 0x3f3f3f3f;
    int u = -1;
    for(int i = 2; i <= N; i++)
        if(!vis[i] && dist[i]!= -1 && dist[i] < tempmin){
            tempmin = dist[i];
            u = i;
        }
    return u;
}

long long dijkstra(){
    for(int i = 1; i <= N; i++){
        if(mp[1][i]+1)dist[i] = mp[1][i];
    }
    int u = getNode();
    while(u+1){
        for(int i = 2; i <= N; i++){
            if(vis[i])continue;
            if(mp[u][i]+1 && dist[i] == -1)
                dist[i] = dist[u] + mp[u][i];
            else if(mp[u][i]+1 && dist[i])
                dist[i] = min(dist[u] + mp[u][i],dist[i]);
        }
        vis[u] = 1;
        u = getNode();
    }
    return dist[N];
}

void init(){
    CLR(mp,-1);
    CLR(dist,-1);
    CLR(vis,0);
}

int main(){
    while(cin >> T >> N){
        init();
        int st,ed,lens;
        for(int i = 1; i <= T; i++){
            cin >> st>> ed >> lens ;
            if(mp[st][ed]!=-1)
                mp[st][ed] = mp[ed][st] = min(lens,mp[ed][st]);
            else
            mp[st][ed] = mp[ed][st] = lens;
            mp[i][i] = 0;
        }

        long long ans = dijkstra();
        cout << ans << endl;
    }
}

[B - Frogger POJ - 2253]

//中間加了輸出,有助於理解。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define dic(x1,y1,x2,y2) sqrt(pow(x1-x2,2)+pow(y1-y2,2))
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
pair<int,int>a[300];
double mp[300][300];
int close[300];
double closedis[300];
void init(){
    CLR(mp,0);
    CLR(close,0);
    CLR(closedis,0);
    CLR(a,0);
}

int main(){
    int k = 0;
    int n;
    while(cin >> n && n){
        double ans = 0;
        for(int i = 0; i < n; i++){
            cin >> a[i].first >> a[i].second;
        }
        for(int i = 0; i < n; i++)
            for(int j = i; j < n; j++)
                mp[i][j] = mp[j][i] = 1.0 * dic(a[i].first, a[i].second, a[j].first, a[j].second);
        for(int i = 0; i < n; i++){
            closedis[i] = mp[0][i];
            close[i] = 0;
        }

        for(int i = 0; i < n - 1; i++){
            double mindic = 1.0*(1<<20);
            int minone;
            for(int j = 0; j < n; j++){
                if(closedis[j] && mindic > closedis[j]){
                    mindic = closedis[j];
                    minone = j;
                }
            }
            cout << i << ":";
            for(int m = 0; m < n; m++)
                cout << closedis[m] << " ";
            cout << endl;
            if(ans < mindic)
                ans = mindic;
            cout << "ans:" <<ans <<endl;
            cout << "minone:" << minone << endl;
            closedis[minone] = 0.0;//didn't visit it again;
            if(minone == 1)
                break;
            for(int j = 0; j < n; j++){
                if(mp[j][minone] < closedis[j]){
                    closedis[j] = mp[j][minone];
                }
            }
        }
        printf("Scenario #%d\n",++k);
        printf("Frog Distance = %.3f\n\n",ans);
    }
    return 0;
}

[C - Heavy Transportation POJ - 1797]

#include<cstdio>
#include<iostream>
#include<cstring>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;

int mp[1100][1100]={0};
int closedis[1100] = {0};
int ans,n,m;
void init(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++)
            mp[i][j] = 0;
        closedis[i] = 0;
    }
    ans = 0x3f3f3f3f;
}
int main(){
    int k=0,T;
    scanf("%d",&T);
    while(++k <= T){
        scanf("%d%d",&n,&m);
        init();
        int from,to,w;
        for(int i = 0; i < m; i++){
            scanf("%d%d%d",&from,&to,&w);
            if(!mp[from][to])
                mp[from][to] = mp[to][from] = w;
            else
                mp[from][to] = mp[to][from] = max(w,mp[from][to]);
        }
        for(int i = 1; i <= n; i++){
            closedis[i] = mp[1][i];
        }
        for(int i = 1;i <= n; i ++){
            int minone;
            int maxdis = 0;
            //find the location to the tree closest;
            for(int j = 1; j <= n; j++){
                if(closedis[j] > maxdis){
                    maxdis = closedis[j];
                    minone = j;
                }
            }
            if(ans > maxdis)
                ans = maxdis;
            closedis[minone] = -1;
            if(minone == n)break;
            for(int i = 1; i <= n; i++){
                if(closedis[i]+1) closedis[i] = max(closedis[i],mp[minone][i]);
            }
        }
        printf("Scenario #%d:\n%d\n",k,ans);
        if(k<T)printf("\n");
    }
    return 0;
}

[D - Silver Cow PartyPOJ - 3268]

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define CLR(a,v) memset(a,v,sizeof a)
int mp[1100][1000];
int time[1100];
using namespace std;
int n, m, X, ans;
int dist[1100],vis[1100];
int todist[1100],tovis[1100];
void init(){
    ans = 0;
    for(int i = 1 ; i <= n; i++){
        for(int j = 1; j <= n; j++)
            mp[i][j] = -1;
        time[i] = 0;
    }
}

int getNode(int *a, int *b){
    int temp = 0x3f3f3f3f;
    int u = -1;

    for(int i = 1 ; i <= n; i++)
    if(!b[i] && a[i]>0 && a[i] < temp){
        temp = a[i];
        u = i;
    }
    return u;
}

void dijkstra(int a){
    CLR(vis,0);
    CLR(dist,0);
    for(int i = 1; i <= n; i++){
        dist[i] = mp[a][i];
    }
    int u = getNode(dist,vis);
    while(u+1){
        for(int i = 1; i <= n; i++){
            if(vis[i])continue;
            if(mp[u][i]<=0)continue;
            if(dist[i]<=0)dist[i] = dist[u] + mp[u][i];
            else dist[i] = min(dist[i], dist[u] + mp[u][i]);
        }
        vis[u] = 1;
        u = getNode(dist,vis);
    }
}
void to_dijkstra(int a){
    CLR(tovis,0);
    CLR(todist,0);
    for(int i = 1; i <= n; i++){
        todist[i] = mp[i][a];
    }
    int u = getNode(todist,tovis);
    while(u+1){
        for(int i = 1; i <= n; i++){
            if(tovis[i])continue;
            if(mp[i][u]<=0)continue;
            if(todist[i]<=0)todist[i] = todist[u] + mp[i][u];
            else todist[i] = min(todist[i], todist[u] + mp[i][u]);
        }
        tovis[u] = 1;
        u = getNode(todist,tovis);
    }
}

int main(){
    while(cin >> n >> m >> X){
        init();
        int from, to, w;
        for(int i = 0; i < m; i++){
            cin >> from >> to >> w;
            if(mp[from][to]<=0)
                mp[from][to] = w;
            else mp[from][to] = min(mp[from][to], w);
        }
        dijkstra(X);
        to_dijkstra(X);
        for(int i =1 ; i<= n; i++){
            if(i == X)continue;
            time[i] = dist[i] + todist[i];
            ans = max(ans, time[i]);
        }
        cout << ans <<endl;
    }
    return 0;
}

[E - Currency Exchange POJ - 1860]

#include<cstdio>
#include<iostream>
#include<cstring>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
struct Node{
    int from;
    int to;
    double r,c;
};
Node edge[320];
int N,M,S;
double V;
double maxm[320];

bool ford(){
    for(int i = 1; i <= N; i++)maxm[i] = 0.0;
    maxm[S] = V;
    //relax
    for(int i = 1; i <= N; i++){
        bool flag = false;
        for(int j = 0; j < 2*M; j++){
            if(maxm[edge[j].from]<edge[j].c)continue;
            if(maxm[edge[j].to ] < (maxm[edge[j].from ] - edge[j].c)*edge[j].r){
                maxm[edge[j].to ] = (maxm[edge[j].from ] - edge[j].c)*edge[j].r;
                flag = true;
            }
        }
        if(!flag)break;
    }
    //judge
    for(int i = 0; i < 2*M; i++)
        if(maxm[edge[i].to ] < (maxm[edge[i].from ] - edge[i].c)*edge[i].r)
            return true;
    return false;
}
void init(){
    CLR(edge,0);
}

int main(){
    while(cin >> N >> M >> S >> V){
        init();
        int A,B;
        double r1,c1,r2,c2;
        for(int i = 0; i < M; i++){
            cin >> A >> B >> r1 >> c1 >> r2 >> c2;
            edge[i].from = A;edge[i].to = B;
            edge[i].r = r1;edge[i].c = c1;
            edge[i+M].to = A;edge[i+M].from = B;
            edge[i+M].r = r2;edge[i+M].c = c2;
        }
        if(ford())cout <<"YES"<<endl;
        else cout <<"NO"<<endl;
    }
    return 0;
}

[H - Cow Contest POJ - 3660 ]

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>

using namespace std;
int mp[200][200];
int main(){
    int n,m;
    while(cin >> n >> m){
        int a,b;
        for(int i = 0 ; i < m; i++){
            cin >> a >> b;
            mp[a][b] = 1;
        }
        for(int k = 1; k <=n; k++ )
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++)
                    if(mp[i][k]&&mp[k][j])
                        mp[i][j] = 1;

        int ans = 0;
        for(int i = 1; i <= n; i++){
            int j;
            for(j = 1; j <= n; j++){
                if(i==j)continue;
                else if(!mp[i][j]&&!mp[j][i])break;
            }
            if(j>n)ans++;
        }
        cout << ans <<endl;
    }
    return 0;
}
//floyed,即看即會。

[I - Arbitrage POJ - 2240]

#include<cstdio>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<string>
#define CLR(a,v) memset(a,v,sizeof a)
using namespace std;
struct Node{
    int from;
    int to;
    double r;
};

map<string, int> a;

Node edge[4000];
int N,M,S;
double V;
double maxm[320];

bool ford(){
    for(int i = 1; i <= N; i++)maxm[i] = 0.0;
    maxm[1] = 10;
    //relax
    for(int i = 1; i <= N; i++){
        bool flag = false;
        for(int j = 0; j < 2*M; j++){
            if(maxm[edge[j].to ] < maxm[edge[j].from] * edge[j].r ){
                maxm[edge[j].to ] = maxm[edge[j].from] * edge[j].r ;
                flag = true;
            }
        }
        if(!flag)break;
    }
    //judge
    for(int i = 0; i < 2*M; i++)
        if(maxm[edge[i].to ] < maxm[edge[i].from] * edge[i].r)
            return true;
    return false;
}
void init(){
    CLR(edge,0);
}

int main(){
    int T=0;
    while(cin >> N && N){
        init();
        for(int i = 0; i < N; i++){
            string temp;
            cin >> temp;
            a[temp] = i;
        }
        cin >> M;
        for(int i = 0; i < M; i++){
            string temp_f,temp_t;
            double temp_m;
            cin >> temp_f >> temp_m >> temp_t;
            edge[i].from = a[temp_f];
            edge[i].to = a[temp_t];
            edge[i].r = temp_m;
        }
        printf("Case %d: ",++T);
        if(ford())cout << "Yes"<<endl;
        else cout << "No" << endl;
    }
    return 0;
}

J - Invitation Cards POJ - 1511

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章