#include <cstdio>
#include <map>
#include <vector>
#define DEBUG false
using namespace std;
struct Wierzcholek{
int kolor;
int nr; // nr kolejnego malowania
map<int, int> krawedz;
}V;
map<int, int>::iterator it;
vector<Wierzcholek> v;
int n,m,q,a,b,dlg,quest,kol,Nr=0;
long long z;
//drukuj liste wierzcholkow
void listaV(int a){
printf("-- Wierzcholek %d --\n",a);
for( it=v[a].krawedz.begin(); it!=v[a].krawedz.end(); it++)
printf("do %d odleglosc:%d\n",it->first,it->second);
return;
}
void maluj(int a, long long restDlg){
//sprawdz czy juz odwiedzono ta krawedz podczas "nr" malowania
if( v[a].nr == Nr)
return;
//printf("%d ",a);
v[a].kolor = kol;
v[a].nr = Nr;
map<int, int>::iterator it;
for( it = v[a].krawedz.begin(); it!=v[a].krawedz.end(); it++){
if( (it->second <= restDlg )&& (v[it->first].nr != Nr) )
maluj( it->first, restDlg - it->second );
}
return;
}
int main(){
scanf(" %d %d %d",&n,&m,&q);
V.kolor = 0; V.nr = 0;
for(int i=0; i<=n; i++)
v.push_back(V);
for(int i=0; i<m; i++){
scanf(" %d %d %d",&a,&b,&dlg);
v[a].krawedz[b] = dlg;
v[b].krawedz[a] = dlg;
}
if(DEBUG)listaV(1);
if(DEBUG)listaV(2);
for(int i=0; i<q; i++){
scanf(" %d",&quest);
switch(quest){
//dodaj krawedz miedzy wierzcholkami a i b o dlugosci dlg
case 1:
scanf(" %d %d %d",&a,&b,&dlg);
v[a].krawedz[b] = dlg;
v[b].krawedz[a] = dlg;
break;
//usun krawedz miedzy wierzcholkami a i b
case 2:
scanf(" %d %d",&a,&b);
v[a].krawedz.erase(b);
v[b].krawedz.erase(a);
break;
//maluj od wierzcholka a kolorem kol oddalone maks o dlugosc z
case 3:
++Nr;//numer malowania
scanf(" %d %lld %d",&a,&z,&kol);
maluj(a,z);
break;
//wypisz kolor wierzcholka
case 4:
scanf(" %d",&a);
printf("%d\n",v[a].kolor);
break;
}
}
if(DEBUG)listaV(1);
if(DEBUG)listaV(2);
return 0;
}
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <cstdio> #include <map> #include <vector> #define DEBUG false using namespace std; struct Wierzcholek{ int kolor; int nr; // nr kolejnego malowania map<int, int> krawedz; }V; map<int, int>::iterator it; vector<Wierzcholek> v; int n,m,q,a,b,dlg,quest,kol,Nr=0; long long z; //drukuj liste wierzcholkow void listaV(int a){ printf("-- Wierzcholek %d --\n",a); for( it=v[a].krawedz.begin(); it!=v[a].krawedz.end(); it++) printf("do %d odleglosc:%d\n",it->first,it->second); return; } void maluj(int a, long long restDlg){ //sprawdz czy juz odwiedzono ta krawedz podczas "nr" malowania if( v[a].nr == Nr) return; //printf("%d ",a); v[a].kolor = kol; v[a].nr = Nr; map<int, int>::iterator it; for( it = v[a].krawedz.begin(); it!=v[a].krawedz.end(); it++){ if( (it->second <= restDlg )&& (v[it->first].nr != Nr) ) maluj( it->first, restDlg - it->second ); } return; } int main(){ scanf(" %d %d %d",&n,&m,&q); V.kolor = 0; V.nr = 0; for(int i=0; i<=n; i++) v.push_back(V); for(int i=0; i<m; i++){ scanf(" %d %d %d",&a,&b,&dlg); v[a].krawedz[b] = dlg; v[b].krawedz[a] = dlg; } if(DEBUG)listaV(1); if(DEBUG)listaV(2); for(int i=0; i<q; i++){ scanf(" %d",&quest); switch(quest){ //dodaj krawedz miedzy wierzcholkami a i b o dlugosci dlg case 1: scanf(" %d %d %d",&a,&b,&dlg); v[a].krawedz[b] = dlg; v[b].krawedz[a] = dlg; break; //usun krawedz miedzy wierzcholkami a i b case 2: scanf(" %d %d",&a,&b); v[a].krawedz.erase(b); v[b].krawedz.erase(a); break; //maluj od wierzcholka a kolorem kol oddalone maks o dlugosc z case 3: ++Nr;//numer malowania scanf(" %d %lld %d",&a,&z,&kol); maluj(a,z); break; //wypisz kolor wierzcholka case 4: scanf(" %d",&a); printf("%d\n",v[a].kolor); break; } } if(DEBUG)listaV(1); if(DEBUG)listaV(2); return 0; } |
English